FOSUserBundle压倒不连贯

Joh*_*ith 5 php forms overriding symfony fosuserbundle

我遇到了关于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 %}
Run Code Online (Sandbox Code Playgroud)

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 %}
Run Code Online (Sandbox Code Playgroud)

现在,这就是我自动理解的内容:布局创建了一个环境,其他模板被"包含"在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 %}
Run Code Online (Sandbox Code Playgroud)

问题

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

有没有人知道FOSUserBundle是不是设计了覆盖模板的通用模式?为什么我需要重建完整的继承树才能在登录和注册表单上显示类似的内容?

解决方案(?)

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

Cer*_*rad 2

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

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

当然,你必须询问作者才能真正了解。我能做的就是猜测。

可以设置模板继承,以便可以使用您自己的布局文件覆盖 FOSUserBundle::layout.html.twig,而无需编辑更改或复制 FOSUserBundle 模板。我不会尝试详细介绍如何执行此操作。我怀疑你已经尝试过了。

使用相同的技术,您可以用您自己的模板替换 FOSUserBundle register_contents 模板。这使您可以自定义注册页面的内容,而不必真正担心它是如何包含的。

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

我的建议:如果模板让您烦恼,那么就不要使用它们。