Templates FOSUserBundle:如何在一个模板中最好地集成登录和注册表单?

Templates FOSUserBundle:如何在一个模板中最好地集成登录和注册表单?,templates,symfony,login,twig,fosuserbundle,Templates,Symfony,Login,Twig,Fosuserbundle,我在我的Symfony应用程序中使用了FOSUserBundle,这真是太棒了。他们在一个单独的模板中有登录和注册表单。我希望两者都在一个模板中,彼此相邻显示 因此,我创建了app/Resources/FOSUserBundle/Security/login.html.twig和app/Resources/FOSUserBundle/Registration/register.html.twig,以覆盖这两个模板。在login.html.twig中,我调用寄存器控制器来呈现其模板 app/Res

我在我的Symfony应用程序中使用了FOSUserBundle,这真是太棒了。他们在一个单独的模板中有登录和注册表单。我希望两者都在一个模板中,彼此相邻显示

因此,我创建了
app/Resources/FOSUserBundle/Security/login.html.twig
app/Resources/FOSUserBundle/Registration/register.html.twig
,以覆盖这两个模板。在
login.html.twig
中,我调用寄存器控制器来呈现其模板

app/Resources/FOSUserBundle/Security/login.html.twig:

{% extends "FOSUserBundle::layout.html.twig" %}

{% trans_default_domain 'FOSUserBundle' %}

{% block fos_user_content %}
    {% if error %}
        <div>{{ error|trans }}</div>
    {% endif %}

    <form action="{{ path("fos_user_security_check") }}" method="post">
        <input type="hidden" name="_csrf_token" value="{{ csrf_token }}" />

        <input type="text" id="username" name="_username" value="{{ last_username }}" placeholder="{{ 'security.login.username'|trans }}" required="required" />

        <input type="password" id="password" name="_password" placeholder="{{ 'security.login.password'|trans }}" required="required" />

        <input type="checkbox" id="remember_me" name="_remember_me" value="on" />
        <label for="remember_me">{{ 'security.login.remember_me'|trans }}</label>

        <input type="submit" id="_submit" name="_submit" value="{{ 'security.login.submit'|trans }}" />
    </form>

    {{ render(controller('FOSUserBundle:Registration:register')) }}
{% endblock fos_user_content %}
{% include "FOSUserBundle:Registration:register_content.html.twig" %}
但是我得到了以下错误:

FatalErrorException: Error: Maximum function nesting level of '100' reached, aborting! in /private/var/www/symfony/My_UserBundle/vendor/twig/twig/lib/Twig/Node/Expression/Array.php line 31
我不知道为什么会收到这个错误消息。如果我查看
安全性:login
注册:register
控制器,模板会以不同的方式呈现:

$this->renderLogin(...

基本上我有两个问题:

  • 错误消息的含义是什么?我如何解决它
  • 也许这种方法并不理想,有更好的解决方案吗

最大嵌套级别来自xdebug,可通过设置解决

xdebug.max_nesting_level = 200
。。。在php.ini中使用:

{% render url('fos_user_security_login') %}
{% render url('fos_user_Registration_register') %}
你可以使用(正如@Sidali Hallak所说的)


但是使用您自己版本的
FOSUserBundle:Registration:register.html.twig
FOSUserBundle:Security:login.html.twig
模板,这些模板不扩展
FOSUserBundle::layout.html.twig
要与较新的Symfony版本兼容,您应该避免使用
{%render%}
标记并使用
{{render(controller('MyBundle:ControllerClass:action'))}
改为:

    {{ render(controller('FOSUserBundle:Security:login')) }}
    {{ render(controller('FOSUserBundle:Registration:register')) }}

Thx,我认为我得到的是一个永无止境的循环,因为100个嵌套级别真的很深。这解决了错误消息。但我正在等待更多关于解决方案的建议,以更好的方式解决我的问题(如果有)。Symfony2的表单组件似乎大量使用递归,请参阅官方文档:(相关部分在页面下方约1/3处)听起来不错。但仍然存在一个主要问题:注册控制器仍然路由到其自己配置的“/寄存器”路由,这不是我想要的路由。我如何影响这一点?我如何告诉他我想要路由回登录和注册相邻的页面?我认为改变FOSUserBundle的路由不是解决方案。顺便说一下:
{%render url('fos_user_security_login')%}
不起作用。您能告诉我为什么吗?您是否已将所有路由导入到自己的路由文件中,登录路由应与注册表文件夹的底部一样位于其中?为了避免与控制器发生冲突,您可以使用
{%render url('fos\u user\u security\u login')%}
FOSUserBundle:Registration:register.html.twig
中,尽管这仍然意味着登录表单将在尝试失败时路由到原始登录路径。要正确执行此操作,我认为您需要自定义注册和安全控制器。这是一个有趣的问题解决方案。我是stu与之格格不入的是,它会拉取整个页面,包括样式,因此我从我的注册和登录页面中获取页眉和页脚。有什么想法吗?理想情况下,有一种方法可以只呈现页面的表单。您是否使用自己版本的
FOSUserBundle:Security:login.html.twig
?原始扩展
FOSUserBundle::layout.html.twig
将被您的子捆绑包覆盖
ChildBundle::layout.html.twig
。将
FOSUserBundle:Security.login.html.twig
复制到您的捆绑包中,并删除
{%extends“FOSUserBundle::layout.html.twig”%}
,并将html从
{%block fos\u user\u content%}
应该做这项工作。我添加了
{%render url('fos\u user\u security\u login')%}
,但是显示登录表单和注册,为什么?因为我可以只显示登录。我想问题出在sonataadmin上
{% render url('fos_user_registration_register') %}
{% render url('fos_user_security_login') %}
    {{ render(controller('FOSUserBundle:Security:login')) }}
    {{ render(controller('FOSUserBundle:Registration:register')) }}