2012-06-05 25 views
8

Pomyślnie skonfigurowaliśmy FOSUserBundle; logowanie, rejestracja, resetowanie hasła itp. działają poprawnie.Symfony FOSUserBundle - dołącz formularz logowania w szablonie układu

Teraz chcemy włączyć formularz logowania do naszego ogólnego układu strony, w szczególności umieszczając formularz w górnej prawej części nagłówka układu. Wykonanie tego byłoby łatwe, gdybyśmy mieli do czynienia tylko z polami nazwy użytkownika i hasła. Jednak nie możemy wydawać się, aby dowiedzieć się jak otrzymać token CSRF, który jest generowany przez serwis FOSUserBundle:

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

Próbowałem wywołanie powyżej zasięgu rozszerzenie Gałązka, które w przeciwnym razie działa bez zarzutu jednak najwyraźniej przedłużenie nie może właściwie odwołaj się do kontenera.

Z pewnością istnieje prosty sposób na uzyskanie tokena CSRF FOSUserBundle na całym świecie?

Dzięki! Jason

Odpowiedz

6

Można zdefiniować funkcję jak to w jednym ze swoich kontrolerów

a potem po prostu umieścić go w swojej postaci poprzez

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

Należy również zawierać następujące u do góry kontrolera:

use Symfony\Component\HttpFoundation\Response; 
34

Symfony 2.3:

Możliwym rozwiązaniem byłoby określenie dostawcy CSRF jako zmienną globalną Twig jak ten:

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

A potem w układzie nazywamy go tak:

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

Nie musisz więc dzwonić do żadnego kontrolera.

Symfony 2.4 i nowsze:

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

oraz:

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

zapisany mój dzień! Dziękuję bardzo! – fanjabi

+3

To powinno być oznaczone jako najlepsza odpowiedź - czystsza i łatwiejsza niż druga. –

+0

To jest najlepsze i najczystsze rozwiązanie. Kontroler Render w szablonach zużywa wiele zasobów: to rozwiązanie jest najlepsze i najczystsze. – Aerendir

Powiązane problemy