web-dev-qa-db-fra.com

Symfony2: Comment obtenir l'utilisateur Object dans le contrôleur lors de l'utilisation de FOSUserBundle?

J'utilise FOSUserBundle pour authentifier mes utilisateurs.

J'essaie de placer l'objet utilisateur dans le contrôleur pour enregistrer un voyage auquel je devrais ajouter l'objet utilisateur avant l'enregistrement.

Je n'ai pas trouvé comment faire cela parce que la méthode suivante l'a trouvée dans la documentation de symfony:

$user = $this->container->get('security.context')->getToken()->getUser();

rend le nom d'utilisateur sous forme de chaîne, mais j'ai besoin de tout l'objet.

Actuellement, j'utilise cette méthode, mais cela 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 cela correctement?

36
skonsoft

Je pense que 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. 

70
Mohammad Niknam

La documentation de la méthode getUser indique:

soit retourne un objet qui implémente __toString (), soit une chaîne primitive est renvoyée.

Et si nous regardons dans la classe FOS\UserBundle\Model\User sur here (la classe d'utilisateurs de base utilisée par FOSUserBundle), nous pouvons voir qu'elle a bien une méthode __toString:

public function __toString()
{
    return (string) $this->getUsername();
}

Je pense que vous obtenez réellement l'objet User, mais puisqu'il implémente une méthode __toString, il peut être restitué directement dans les modèles.

Dans Twig, vous pouvez utiliser:

{{ dump(user) }}

Pour voir quel genre d'objet vous avez. Mais vous utilisez réellement un objet, pas une chaîne.

15
Ramon Kleiss

Solution:

$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->findUserByUsername($this->container->get('security.context')
                    ->getToken()
                    ->getUser())
9
karda

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 cela suffit pour accéder à l'objet utilisateur. Pas besoin d'appeler $user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);

De plus, votre méthode find transforme automatiquement et implicitement votre objet initial $ username en chaîne car elle n'attend pas un objet en tant qu'argument.

3
Tsounabe

J'ai eu le même problème, pour le résoudre, ajoutez les classes FOS dans votre section utilisation i.e:

use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Model\UserInterface;
2
user1829870

Dans symfony> = 3.2, documentation indique que:

Une autre façon d’obtenir l’utilisateur actuel dans un contrôleur consiste à type-hint l'argument du contrôleur avec UserInterface (et le défaut à null si la connexion est facultative):

use Symfony\Component\Security\Core\User\UserInterface\UserInterface;

public function indexAction(UserInterface $user = null)
{
    // $user is null when not logged-in or anon.
}

Ceci est uniquement recommandé aux développeurs expérimentés qui n’étendent pas depuis le contrôleur de base Symfony et n’utilisez pas le ControllerTrait non plus. Sinon, il est recommandé de continuer à utiliser getUser () raccourci.

Voici l'article de blog about it

2
Nikita U.
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');
}
0
tfont

Pour FOSUser ^ 1.3, vous pouvez obtenir l'utilisateur actuel à partir d'un contrôleur développant BaseController comme ceci:

$user = $this->container->get('security.token_storage')->getToken()->getUser();
0
Hassan Juniedi