Symfony2:Comment obtenir de l'utilisateur de l'Objet à l'intérieur du contrôleur lors de l'utilisation de FOSUserBundle?
-
11-12-2019 - |
Question
J'utilise FOSUserBundle pour authentifier mes utilisateurs.
Je vais essayer d'obtenir l'objet de l'utilisateur à l'intérieur du Contrôleur pour inscrire un voyage où je me dois d'ajouter l'utilisateur de l'objet de ce Voyage avant de les enregistrer.
Je n'ai pas trouvé comment le faire parce que suivant la méthode où je l'ai trouvé dans la doc de symfony:
$user = $this->container->get('security.context')->getToken()->getUser();
rend le nom d'utilisateur de la chaîne, mais j'ai besoin de l'ensemble de l'objet.
Actuellement, j'utilise cette méthode, mais il ne fonctionne pas correctement.
$username = $this->container->get('security.context')->getToken()->getUser();
$em = $this->container->get('doctrine')->getEntityManager();
$user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);
Comment puis-je faire correctement ce?
La solution
Je pense Ramon a raison.Vous avez déjà l'objet utilisateur.
aussi dans Symfony> 2.1.x Vous pouvez utiliser
$this->getUser();
à l'intérieur du contrôleur.
Autres conseils
La documentation de l' getUser
méthode indique:
renvoie un objet qui implémente __toString(), ou une primitive de la chaîne est renvoyée.
Et si nous regardons dans la FOS\UserBundle\Model\User
classe, plus de ici (la base de la classe d'utilisateur utilisé par le FOSUserBundle), nous pouvons voir que c'est en effet un __toString
méthode:
public function __toString()
{
return (string) $this->getUsername();
}
Je pense que vous avez réellement obtenir la User
objet, mais parce qu'il met en œuvre une __toString
méthode il peut être rendu directement dans les templates.
Dans Twig, vous pouvez utiliser:
{{ dump(user) }}
Pour voir quel type d'objet que vous avez.Mais Vous êtes en fait en utilisant un objet, pas une chaîne de caractères.
solution:
$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->findUserByUsername($this->container->get('security.context')
->getToken()
->getUser())
Dans FOSUser 1.3 vous ne pouvez pas appeler directement $this->getUser
dans SecurityController.
Vous devez appeler $this->container->get('security.context')->getToken()->getUser();
Et c'est suffisant pour accéder à l'objet utilisateur.Pas besoin d'appeler $user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);
En outre, votre find
la méthode automatiquement et implicitement jeté votre initiale de nom d'utilisateur de l'objet à chaîne, car il n'attend pas un objet comme argument.
J'ai eu le même problème, de résoudre ce problème, ajoutez les classes FOS dans votre section d'utilisation I.E:
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Model\UserInterface;
dans Symfony>= 3.2, Documentation stipule que:
Un moyen alternatif d'obtenir l'utilisateur actuel dans un contrôleur est de Type-Assiez l'argument du contrôleur avec userface (et par défaut Pour null si être connecté est facultatif):
use Symfony\Component\Security\Core\User\UserInterface\UserInterface; public function indexAction(UserInterface $user = null) { // $user is null when not logged-in or anon. }
Ceci n'est recommandé que pour les développeurs expérimentés qui ne s'étendent pas de contrôleur de base symporé et don ' t Utilisez le ContrôlerRait Soit. Sinon, il est recommandé de continuer à utiliser le getUser () raccourci.
Pour Fosuser ^ 1.3 Vous pouvez obtenir l'utilisateur actuel de l'intérieur d'un contrôleur qui étend le basocontroller comme celui-ci:
$user = $this->container->get('security.token_storage')->getToken()->getUser();
public function indexAction()
{
/* @var $user \FOS\UserBundle\Model\UserInterface */
if ($user = $this->getUser())
{
echo '<pre>';
print_r($user);
print_r($user->getRoles()); // method usage example
exit;
return $this->redirectToRoute('dashboard');
}
return $this->redirectToRoute('login');
}