我知道这个问题在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:main.html.twig”中不存在
该代码由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识别。或者其他我没有得到的东西。
那边的任何线索?
答案 0 :(得分:4)
由于您未使用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
变量传递给您的视图
同时检查my answer类似问题