Symfony FOSUserBundle - 在布局模板中包含登录表单

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)

  • 这应该被标记为最佳答案 - 比其他人更清洁,更容易. (3认同)

小智 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)