Jas*_*son 10 php symfony1 twig
我们已经成功配置了FOSUserBundle; 登录,注册,重置密码等都工作得很好.
现在我们要将登录表单合并到我们的常规站点布局中,特别是将表单放在布局标题的右上角部分.如果我们只处理用户名和密码字段,那么这样做很容易.但是,我们似乎无法弄清楚如何获取由FOSUserBundle服务生成的CSRF令牌:
$this->container->get('form.csrf_provider')->generateCsrfToken('authenticate');
Run Code Online (Sandbox Code Playgroud)
我尝试在Twig扩展中调用上面的内容,否则工作正常,但显然扩展无法正确引用容器.
当然有一些简单的方法可以全局获取FOSUserBundle CSRF令牌吗?
谢谢!贾森
Dav*_*les 44
Symfony 2.3:
一种可能的解决方案是将csrf提供程序定义为Twig全局变量,如下所示:
twig:
globals:
fos_csrf_provider: "@form.csrf_provider"
Run Code Online (Sandbox Code Playgroud)
然后在你的布局中调用它像这样:
<input type="hidden" name="_csrf_token" value="{{ fos_csrf_provider.generateCsrfToken('authenticate') }}" />
Run Code Online (Sandbox Code Playgroud)
所以你不需要调用任何控制器.
Symfony 2.4及更高版本:
twig:
globals:
fos_csrf_provider: "@security.csrf.token_manager"
Run Code Online (Sandbox Code Playgroud)
和:
<input type="hidden" name="_csrf_token" value="{{ fos_csrf_provider.refreshToken('authenticate') }}" />
Run Code Online (Sandbox Code Playgroud)
小智 6
您可以在其中一个控制器中定义这样的函数
public function getTokenAction()
{
return new Response($this->container->get('form.csrf_provider')
->generateCsrfToken('authenticate'));
}
Run Code Online (Sandbox Code Playgroud)
然后通过将其嵌入到您的表单中
<input type="hidden" name="_csrf_token" value="{% render('YourBundle:YourController:getToken') %}" />
Run Code Online (Sandbox Code Playgroud)
您还需要在控制器顶部包含以下内容:
use Symfony\Component\HttpFoundation\Response;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11564 次 |
| 最近记录: |