我遇到过无数关于 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
block 是对 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 中,因此其中没有 extends 语句。它是包含 extends 语句的 register.html.twig。不确定这是否对您的问题有帮助。
更新:那么他们为什么要这样做呢?
当然你会要求作者真正知道。我所能做的就是推测。
可以设置模板继承,这样 FOSUserBundle::layout.html.twig 就可以被您自己的布局文件覆盖,而无需编辑更改或复制 FOSUserBundle 模板。我不会尝试详细介绍如何执行此操作。我怀疑您已经尝试过了。
使用相同的技术,您可以将 FOSUserBundle register_contents 模板替换为您自己的模板。这使您可以自定义注册页面的内容,而不必真正担心它是如何包含在内的。
就个人而言,我发现整个包很乱。我将一些用户实体和管理器内容复制到我自己的用户包中。我忽略了他们的模板和 Controller 。如果曾经发布过针对 S2.1 或更高版本的稳定版本,那么我可能会重新访问该包。但是 S2.1 已经发布多年,仍然没有可用的稳定版本。
我的建议:如果模板对您造成困扰,请不要使用它们。
关于php - FOSUserBundle 覆盖不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21366408/