FOSUserBundle压倒不连贯

时间:2014-01-26 16:58:53

标签: php forms symfony fosuserbundle override

我遇到过关于FOSU​​serBundle最重要的可能性的无数问题,并且在使用Twig的继承机制时发现了一些“设计不连贯”,我想澄清一下,因为它在某些项目中真的令人不安......

覆盖FOSUserBundle

中的模板

从我读过的内容来看,我们应该如何覆盖模板。比方说,登录模板(Security/login.html.twig)。首先,我需要覆盖全局FOSUser布局(layout.html.twig')。

全球FOSUser布局

{% extends "::layout.html.twig" %}
{% block title %}Page title{% endblock title %}
{% block body %}
    <div id="container">
       {% block fos_user_content %}{% endblock %}
    </div>
{% endblock body %}

titlebody块是对HTML <title><body>标记(全局)的引用。现在,谈到登录本身,这就是我写的内容。

登录表单

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

{% block fos_user_content %}
    {% if error %}
        <div class="error">{{ error|trans({}, 'FOSUserBundle') }}</div>
    {% endif %}
    <form action="{{ path("fos_user_security_check") }}" method="post">
        <input type="hidden" name="_csrf_token" value="{{ csrf_token }}" />
        <label for="username">{{ 'security.login.username'|trans({}, 'FOSUserBundle') }}</label>
        <input type="text" id="username" name="_username" value="{{ last_username }}" required="required" /><br />
        <label for="password">{{ 'security.login.password'|trans({}, 'FOSUserBundle') }}</label>
        <input type="password" id="password" name="_password" required="required" /><br />
        <input type="checkbox" class="checkbox" id="remember_me" name="_remember_me" value="on" />
        <label for="remember_me">{{ 'security.login.remember_me'|trans({}, 'FOSUserBundle') }}</label><br />
        <label for="_submit"></label>
        <input type="submit" class="submit" id="_submit" name="_submit" value="{{ 'security.login.submit'|trans({}, 'FOSUserBundle') }}" />
    </form>
{% endblock fos_user_content %}

现在,这就是我自动理解的内容:布局创建了一个环境,其他模板被“包含”到fos_user_content块中。登录页面的结果遵循此方案。

另一次尝试?注册

现在,按照这种模式,我试图扩展注册表格,思考:“我应该像以前一样扩展fos_user_content的内容!猜猜是什么?不是吗?这是我的Registration/register_content.html.twig文件。

注册表单内容

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

{% block fos_user_content %}
    <form action="{{ path('fos_user_registration_register') }}" {{ form_enctype(form) }} method="POST" class="fos_user_registration_register">
        {{ form_widget(form) }}
        <div>
            <input type="submit" value="{{ 'registration.submit'|trans({}, 'FOSUserBundle') }}" />
        </div>
    </form>
{% endblock %}

问题

以前的模式似乎不适用于注册部分:当我遵循相同的方案时,我的注册页面以图形方式加倍。表格打印两次,标题也是如此......就像我在某处做了不必要的包含/继承......

有没有人有任何想法FOSUserBundle没有设计用于覆盖模板的通用模式?为什么我需要重建完整的继承树,以便在登录和注册表单上都有类似的显示?

解决方案(?)

Cerad的回答为注册案例提供了不同的方案。 Twig继承树排除register_content.html.twig,并使用register.html.twig。当您查看此文件时,您可以看到它...包括register_content.html.twig。这是我所说的不连贯。为什么是这样 ?为什么不直接使用包含内容的单个文件?为什么FOS决定添加这个无用(?)包含步骤?

2 个答案:

答案 0 :(得分:2)

我不完全确定我理解你的问题。 register_content.html.twig旨在包含在register.html.twig中,因此其中没有extends语句。 register.html.twig包含extends语句。不确定这是否有助于解决您的问题。

更新:为什么他们这样做呢?

当然,您将要求作者真正了解。我所能做的只是推测。

可以设置模板继承,以便可以使用您自己的布局文件覆盖FOSUserBundle :: layout.html.twig,而无需编辑更改或复制FOSUserBundle模板。我不会试着详细说明如何做到这一点。我怀疑你已经尝试过了。

使用相同的技术,您可以用自己的模板替换FOSUserBundle register_contents模板。这样,您就可以自定义注册页面的内容,而无需真正担心它的确切内容。

就个人而言,我发现整个捆绑都很混乱。我将一些用户实体和经理的东西复制到我自己的用户包中。我忽略了他们的模板和控制器。如果发布的目标是S2.1或更高版本的稳定版本,那么我可能会重新访问该捆绑包。但是自从S2.1发布以来已经有好几年了,而且仍然没有可用的稳定版本。

我的建议:如果模板是你的错误,那么就不要使用它们。

答案 1 :(得分:1)

这完全是一种可怕而不连贯的设计。解决方案是覆盖reset.html.twig:

之前

reset.html.twig

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

{% block fos_user_content %}
{% include "FOSUserBundle:Resetting:reset_content.html.twig" %}
{% endblock fos_user_content %}

之后

reset.html.twig

{% block fos_user_content %}
{% include "FOSUserBundle:Resetting:reset_content.html.twig" %}
{% endblock fos_user_content %}

然后在您的登录或重置模板上,您可以使用

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

这种方法适用于登​​录,注册等。