151 votes

Comment obtenir l'entité qui représente l'utilisateur actuel dans Symfony2?

Je suis à l'aide de Symfony configuration de la sécurité. Tout fonctionne bien, mais je ne sais pas comment faire une chose importante:

Dans twig, je peux atteindre l'utilisateur actuel de l'info en faisant:

Welcome, {{ app.user.username }}

ou similaire

Comment puis-je avoir accès à ces mêmes informations dans le Contrôleur? Plus précisément, je veux obtenir l'utilisateur actuel de l'entité afin que je puisse les stocker sur le plan relationnel dans une autre entité (one-to-one mapping).

J'espérais vraiment qu'il serait

$this->get('security.context')->getToken()->getUser()

mais cela ne fonctionne pas. Il me donne une classe de type

Symfony\Component\Security\Core\User\User

et j'en veux un de type

Acme\AuctionBundle\Entity\User

qui est mon entité....

235voto

Cristian Douce Points 1112

Comme le dit ktolis, vous devez d’abord configurer votre /app/config/security.yml.

Puis avec

 $usr= $this->get('security.context')->getToken()->getUser();
$usr->getUsername();
 

devrait être enougth!

$ usr est votre objet utilisateur! Vous n'avez pas besoin de l'interroger à nouveau.

Trouvez le moyen de configurer vos fournisseurs dans security.yml à partir de la documentation Sf2 et réessayez.

Meilleure chance!

67voto

AntoineSubit Points 657

Depuis Symfony 2.1.x, utilisez simplement:

 $this->getUser();
 

Et si vous voulez directement le nom d'utilisateur, par exemple:

 $username = $this->getUser()->getUsername();
 

6voto

hj' Points 23

Le fil est un peu vieux mais je pense que cela pourrait sauver quelqu'un ...

J'ai rencontré le même problème que la question d'origine, que le type est montré comme Symfony\Component\Security\Core\User\User

Il finit par s'est avéré que j'ai été connecté à l'aide d'une mémoire utilisateur

ma sécurité.yml ressemble à quelque chose comme ceci

security:
    providers:
        chain_provider:
            chain:
                providers: [in_memory, fos_userbundle]
        fos_userbundle:
            id: fos_user.user_manager
        in_memory:
            memory:
                users:
                    user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                    admin: { password: adminpass, roles: [ 'ROLE_ADMIN', 'ROLE_SONATA_ADMIN' ] }

le in_memory utilisateur est toujours de type Symfony\Component\Security\Core\User\User si vous souhaitez utiliser votre propre entité, connectez-vous en utilisant le fait que le fournisseur de l'utilisateur.

Merci, hj

-39voto

ktolis Points 333

Bien, d'abord, vous devez demander le nom d'utilisateur de l'utilisateur de la session dans votre contrôleur de l'action comme ceci:

$username=$this->get('security.context')->getToken()->getUser()->getUserName();

puis faire une requête à la base de données et obtenir votre objet avec des régulière dql comme

$em = $this->get('doctrine.orm.entity_manager');    
"SELECT u FROM Acme\AuctionBundle\Entity\User u where u.username=".$username;
$q=$em->createQuery($query);
$user=$q->getResult();

l' $utilisateur doit maintenant tenir l'utilisateur avec ce nom d'utilisateur ( vous pouvez aussi utiliser d'autres champs de cours)

...mais vous devez d'abord configurer votre /app/config/security.yml de configuration pour utiliser le champ approprié de votre fournisseur de services de sécurité comme suit:

security:
 provider:
  example:
   entity: {class Acme\AuctionBundle\Entity\User, property: username}

espérons que cette aide!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X