如何从FOSUserBundle覆盖layout.html.twig


How to override layout.html.twig from FOSUserBundle

我知道这个问题在FOSUserBundle文档中得到了完美的回答,但我无法解决我的问题。

我正在尝试使用FOSUserBundle创建一个自己的登录页面。

我有一个main.html.twig,它与FOSUserBundle源中包含的login.html.twig完全相同。

唯一的区别是main.html.twig在我自己的bundle结构中,login.html.twig在FOSUserBundle文件夹结构中。

我达到了/login/main。我解决了它们并开始渲染。

但是当访问/main时,我得到以下错误:

Twig_Error_Runtime:变量"csrf_token"不存在于第5行的"AcmeStoreBundle:Main.html.trick"中

FOSUserBundle用户知道该代码,但无论如何我都会把它粘贴到这里:

<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="" />
<label for="password">{{ 'security.login.password'|trans({}, 'FOSUserBundle') }}</label>
<input type="password" id="password" name="_password" />
<input type="checkbox" id="remember_me" name="_remember_me" value="on" />
<label for="remember_me">{{ 'security.login.remember_me'|trans({}, 'FOSUserBundle') }}</label>
<input type="submit" id="_submit" name="_submit" value="{{ 'security.login.submit'|trans({}, 'FOSUserBundle') }}" />

变量"csrf_token"在某种程度上无法从FOSUserBundle外部识别。或者其他我没有得到的东西。

那边有线索吗?

由于您没有使用FormBuilder,因此在负责渲染main.html.twig的操作中,您应该生成此令牌并将其传递给View。

$csrf = $this->get('form.csrf_provider'); //Symfony'Component'Form'Extension'Csrf'CsrfProvider'SessionCsrfProvider by default
$token = $csrf->generateCsrfToken($intention); //Intention should be empty string, if you did not define it in parameters

您应该将$token作为csrf_token变量传递给您的View

还可以查看我对类似问题的回答