FOSUserBundle覆盖不一致
我遇到过无数关于FOSUserBundle压倒一切可能性的问题,并且在使用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 %}
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决定添加这个无用的(?)包含步骤?
我不完全确定我理解你的问题。 register_content.html.twig被设计为由register.html.twig包含,因此在其中没有扩展语句。 它是包含了扩展语句的register.html.twig。 不知道这是否会帮助你解决问题。
更新:为什么他们这样做?
当然,你会有问题的作者真正知道。 我所能做的只是猜测。
可以设置模板继承,以便可以使用您自己的布局文件覆盖FOSUserBundle :: layout.html.twig,而无需编辑更改或复制FOSUserBundle模板。 我不会试图详细说明如何做到这一点。 我怀疑你已经尝试过了。
使用相同的技术,您可以用您自己的方法替换FOSUserBundle register_contents模板。 这让您可以自定义注册页面的内容,而不必担心其包含的内容。
就我个人而言,我发现整个捆绑是混乱的。 我将一些用户实体和经理的东西复制到我自己的用户包中。 我忽略了他们的模板和控制器。 如果一个稳定版本发布的目标是S2.1或更高版本,那么我可能会重新访问该捆绑包。 但是自从S2.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" %}
这种方法适用于登录,注册等。
链接地址: http://www.djcxy.com/p/91683.html