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?
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.
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.
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 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.
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;
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
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');
}
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();