Accesso all'utente connesso in un modello


94

Sto usando FOSuserbundle per iniziare con la registrazione dell'utente https://github.com/FriendsOfSymfony/FOSUserBundle

L'ho registrato / loggato e disconnesso. Quello che voglio fare ora è prendere i dati degli utenti registrati e presentarli in ogni pagina del mio sito. Come "Ciao nome utente" nel tipo di intestazione dell'oggetto.

Sembra che incorporare un controller nella mia app / Resources / views / base.html.twig sia il modo migliore per farlo http://symfony.com/doc/current/book/templating.html#embedding-controllers

Quindi ho scritto il mio controller per accedere ai dati del profilo utente. Quello che non riesco a capire è come accedere ai metodi FOS nel mio controller incorporato. Quindi dal mio Acme / UserBundle / Controller / UserController.php voglio fare questo:

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));
}

che ho preso da: vendor / bundles / FOS / UserBundle / Controller / ProfileController.php

Risposte:


229

È possibile accedere ai dati dell'utente direttamente nel modello twig senza richiedere nulla nel controller. L'utente è accessibile così: app.user.

Ora puoi accedere a ogni proprietà dell'utente. Ad esempio, è possibile accedere al nome utente così: app.user.username.

Attenzione, se l'utente non è registrato, app.userè nullo.

Se vuoi controllare se l'utente è loggato, puoi usare la is_grantedfunzione twig. Ad esempio, se vuoi controllare se l'utente ha ROLE_ADMIN, devi solo fare is_granted("ROLE_ADMIN").

Quindi, in ogni tua pagina puoi fare:

{% if is_granted("ROLE") %}
    Hi {{ app.user.username }}
{% endif %}

8
Grazie. In realtà ho cambiato "ROLE" in "IS_AUTHENTICATED_REMEMBERED" e ha funzionato alla grande.
ed209

5
Non sto usando FOSuserbundle (a meno che non venga fornito con) ma ha app.user.usernamecomunque funzionato per me. Potrebbe essere utile che qualcuno lo sappia.
Jason Swett

1
Symfony \ Bundle \ FrameworkBundle \ Templating \ GlobalVariables non fa parte del FOSUserBundle ed è per questo che funziona sempre (è qui che i twig Globals sono definiti in 2.5) (rispetto a Jason Swett 30 marzo)
DerStoffel

16

Per symfony 2.6 e versioni successive possiamo usare

{{ app.user.getFirstname() }}

poiché la variabile globale app.security per il modello Twig è stata deprecata e verrà rimossa dalla 3.0

Ulteriori informazioni:

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

e vedere le variabili globali in

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


4
chiamata di metodo non necessaria. Puoi utilizzare attributi dinamici come questo {{ app.user.firstname }}. Immagino sia più front-end-dev-friendly.
kacper3w

2
Anche se sono d'accordo con il commento sopra sull'essere inutili, lo voterò a favore perché dimostra che i metodi personalizzati possono essere utilizzati se lo si desidera
Simon

-1
{{app.user.username | default ('')}} app.user.username|default('') }}

Basta presentare il nome utente di accesso, ad esempio, la funzione di filtro predefinita ('') dovrebbe essere utile quando l'utente NON effettua l'accesso, evitando solo fastidiosi messaggi di errore.


2
e come risolve il problema? Forse è necessario aggiungere una spiegazione
Balwinder Singh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.