Dostęp do zalogowanego użytkownika w szablonie

94

Aby rozpocząć rejestrację użytkownika, używam FOSuserbundle https://github.com/FriendsOfSymfony/FOSUserBundle

Mam to podczas rejestracji / logowania i wylogowywania. Teraz chcę pobrać dane zalogowanych użytkowników i zaprezentować je na każdej stronie mojej witryny. Na przykład „Cześć, nazwa użytkownika” w nagłówku.

Wygląda na to, że osadzenie kontrolera w mojej aplikacji / Resources / views / base.html.twig jest najlepszym sposobem na zrobienie tego http://symfony.com/doc/current/book/templating.html#embedding-controllers

Napisałem więc do mojego kontrolera, aby uzyskać dostęp do danych profilu użytkownika. Nie mogę dowiedzieć się, jak uzyskać dostęp do metod FOS w moim wbudowanym kontrolerze. Więc z mojego Acme / UserBundle / Controller / UserController.php chcę to zrobić:

public function showAction()
{
    $user = $this->container->get('security.context')->getToken()->getUser();
    if (!is_object($user) || !$user instanceof UserInterface) {
        throw new AccessDeniedException(
               'This user does not have access to this section.');
    }

    return $this->container->get('templating')
      ->renderResponse('FOSUserBundle:Profile:show.html.'.$this->container
      ->getParameter('fos_user.template.engine'), array('user' => $user));
}

które wziąłem od: vendor / bundles / FOS / UserBundle / Controller / ProfileController.php

ed209
źródło

Odpowiedzi:

229

Możesz uzyskać dostęp do danych użytkownika bezpośrednio w szablonie twig, bez żądania niczego w kontrolerze. Użytkownik jest dostępny w ten sposób:app.user .

Teraz możesz uzyskać dostęp do wszystkich właściwości użytkownika. Na przykład możesz uzyskać dostęp do nazwy użytkownika w ten sposób:app.user.username .

Ostrzeżenie, jeśli użytkownik nie jest zalogowany, app.userwartość ma wartość null.

Jeśli chcesz sprawdzić, czy użytkownik jest zalogowany, możesz skorzystać z is_grantedfunkcji gałązka. Na przykład, jeśli chcesz sprawdzić, czy użytkownik ma ROLE_ADMIN, po prostu musisz to zrobić is_granted("ROLE_ADMIN").

Tak więc na każdej ze swoich stron możesz:

{% if is_granted("ROLE") %}
    Hi {{ app.user.username }}
{% endif %}
egeloen
źródło
8
dzięki. Właściwie zmieniłem rolę „ROLE” na „IS_AUTHENTICATED_REMEMBERED” i działało świetnie.
ed209
5
Nie używam FOSuserbundle (chyba że jest teraz z nim), ale app.user.usernamenadal działało dla mnie. Może się to przydać, żeby ktoś wiedział.
Jason Swett
1
Symfony \ Bundle \ FrameworkBundle \ Templating \ GlobalVariables nie jest częścią FOSUserBundle, dlatego to działa zawsze (tam, gdzie gałązka Globals są zdefiniowane w 2.5) (w odniesieniu do Jasona Swetta 30 marca ')
DerStoffel
16

Dla symfony 2.6 i nowszych możemy użyć

{{ app.user.getFirstname() }}

tak jak zmienna globalna app.security dla szablonu Twig została wycofana i zostanie usunięta z wersji 3.0

więcej informacji:

http://symfony.com/blog/new-in-symfony-2-6-security-component-improvements

i zobacz zmienne globalne w

http://symfony.com/doc/current/reference/twig_reference.html

zubair Shaik
źródło
4
niepotrzebne wywołanie metody. Możesz użyć takich atrybutów dynamicznych {{ app.user.firstname }}. Sądzę, że jest bardziej przyjazny dla programistów.
kacper3w
2
Mimo że zgadzam się z powyższym komentarzem, że jest to niepotrzebne, mam zamiar głosować za tym, ponieważ pokazuje, że można użyć niestandardowych metod, jeśli jest to pożądane
Simon
-1
{{ aplikacja . użytkownika . nazwa użytkownika | domyślny ( '' ) }} 

Po prostu podaj nazwę użytkownika logowania, na przykład domyślna funkcja filtru ('') powinna być przyjemna, gdy użytkownik NIE jest zalogowany, po prostu unikaj irytującego komunikatu o błędzie.

Wei Zhang
źródło
2
i jak rozwiązuje problem? Być może musisz dodać wyjaśnienie
Balwinder Singh