我遇到过关于FOSUserBundle最重要的可能性的无数问题,并且在使用Twig的继承机制时发现了一些“设计不连贯”,我想澄清一下,因为它在某些项目中真的令人不安......
从我读过的内容来看,我们应该如何覆盖模板。比方说,登录模板(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 %}
title
和body
块是对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决定添加这个无用(?)包含步骤?
答案 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" %}
这种方法适用于登录,注册等。