Symfony FOSUserBundle - включить форму входа в шаблон макета

Мы успешно настроили FOSUserBundle; Войти, зарегистрироваться, сбросить пароль и т. д., все работает просто отлично.

Теперь мы хотим включить форму входа в наш общий макет сайта, в частности, поместив форму в верхний правый раздел заголовка макета. Это было бы достаточно просто, если бы мы имели дело только с полями имени пользователя и пароля. Однако мы, похоже, не можем выяснить, как получить токен CSRF, который генерируется службой FOSUserBundle:

$this->container->get('form.csrf_provider')->generateCsrfToken('authenticate');

Я попытался вызвать вышеупомянутое внутри расширения Twig, которое в противном случае работает нормально, но, очевидно, расширение не может правильно ссылаться на контейнер.

Конечно, есть какой-то простой способ получить токен FOSUserBundle CSRF глобально?

Спасибо! Джейсон

Ответы на вопрос(2)

Решение Вопроса

public function getTokenAction()
{
    return new Response($this->container->get('form.csrf_provider')
                            ->generateCsrfToken('authenticate'));
}

а затем просто вставьте его в форму через

<input type="hidden" name="_csrf_token" value="{% render('YourBundle:YourController:getToken') %}" />

Вы также должны включить следующее в верхней части вашего контроллера:

use Symfony\Component\HttpFoundation\Response;

Symfony 2.3:

Одним из возможных решений было бы определение поставщика csrf как глобальной переменной Twig, например:

twig:
    globals:
        fos_csrf_provider: "@form.csrf_provider"

И тогда в вашем макете назовите это так:

<input type="hidden" name="_csrf_token" value="{{ fos_csrf_provider.generateCsrfToken('authenticate') }}" />

Таким образом, вам не нужно вызывать какой-либо контроллер.

Symfony 2.4 and later:

twig:
    globals:
        fos_csrf_provider: "@security.csrf.token_manager"

а также:

<input type="hidden" name="_csrf_token" value="{{ fos_csrf_provider.refreshToken('authenticate') }}" />
 11 июл. 2013 г., 17:08
спас мой день! Спасибо огромное!
 27 февр. 2015 г., 14:27
Это лучшее и самое чистое решение. Контроллер рендеринга в шаблонах потребляет много ресурсов: это решение самое лучшее и самое чистое.
 07 апр. 2017 г., 18:04
Это то же самое для Symfony 3.2?
 25 нояб. 2014 г., 07:28
Это должно быть отмечено как лучший ответ - чище и проще, чем другой.

Ваш ответ на вопрос