Accéder à l'utilisateur connecté dans un modèle

94

J'utilise FOSuserbundle pour commencer l'enregistrement de l'utilisateur https://github.com/FriendsOfSymfony/FOSUserBundle

Je l'ai enregistré / connecté et déconnecté. Ce que je veux faire maintenant, c'est récupérer les données des utilisateurs connectés et les présenter sur chaque page de mon site. Comme "Salut nom d'utilisateur" dans le type d'en-tête de chose.

Il semble que l'intégration d'un contrôleur dans mon application / Resources / views / base.html.twig est le meilleur moyen de le faire http://symfony.com/doc/current/book/templating.html#embedding-controllers

J'ai donc écrit mon contrôleur pour accéder aux données du profil utilisateur. Ce que je ne peux pas comprendre, c'est comment accéder aux méthodes FOS dans mon contrôleur intégré. Donc, à partir de mon Acme / UserBundle / Controller / UserController.php, je veux faire ceci:

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

dont j'ai récupéré: vendeur / bundles / FOS / UserBundle / Controller / ProfileController.php

ed209
la source

Réponses:

229

Vous pouvez accéder aux données utilisateur directement dans le modèle Twig sans rien demander dans le contrôleur. L'utilisateur est accessible comme ça: app.user.

Désormais, vous pouvez accéder à toutes les propriétés de l'utilisateur. Par exemple, vous pouvez accéder au nom d' utilisateur comme ça: app.user.username.

Attention, si l'utilisateur n'est pas connecté, le app.userest nul.

Si vous souhaitez vérifier si l'utilisateur est connecté, vous pouvez utiliser la is_grantedfonction brindille. Par exemple, si vous voulez vérifier si l'utilisateur l'a fait ROLE_ADMIN, il vous suffit de le faire is_granted("ROLE_ADMIN").

Ainsi, dans chacune de vos pages, vous pouvez faire:

{% if is_granted("ROLE") %}
    Hi {{ app.user.username }}
{% endif %}
Egeloen
la source
8
Merci. J'ai en fait changé "ROLE" pour "IS_AUTHENTICATED_REMEMBERED" et cela a très bien fonctionné.
ed209 du
5
Je n'utilise pas FOSuserbundle (à moins qu'il ne soit maintenant livré avec) mais app.user.usernamej'ai quand même travaillé pour moi. Cela pourrait être utile à quelqu'un de le savoir.
Jason Swett
1
Symfony \ Bundle \ FrameworkBundle \ Templating \ GlobalVariables ne fait pas partie du FOSUserBundle, c'est pourquoi cela fonctionne toujours (c'est là que les brindilles Globals sont définies en 2.5) (en ce qui concerne Jason Swett 30 mars ')
DerStoffel
16

Pour symfony 2.6 et supérieur, nous pouvons utiliser

{{ app.user.getFirstname() }}

car la variable globale app.security pour le modèle Twig est obsolète et sera supprimée de la version 3.0

Plus d'informations:

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

et voir les variables globales dans

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

Zubair Shaik
la source
4
appel de méthode inutile. Vous pouvez utiliser des attributs dynamiques comme celui-ci {{ app.user.firstname }}. C'est plus convivial pour les développeurs frontaux, je suppose.
kacper3w
2
Même si je suis d'accord avec le commentaire ci-dessus sur le fait d'être inutile, je vais voter pour cela car cela démontre que des méthodes personnalisées peuvent être utilisées si vous le souhaitez
Simon
-1
{{app.user.username | default ('')}}app . utilisateur . nom d'utilisateur | par défaut ( '' ) }} 

Présentez simplement le nom d'utilisateur de connexion, par exemple, la fonction de filtrage par défaut ('') devrait être agréable lorsque l'utilisateur n'est PAS connecté en évitant simplement les messages d'erreur ennuyeux.

Wei Zhang
la source
2
et comment résout-il le problème? Peut-être avez-vous besoin d'ajouter une explication
Balwinder Singh