2012-09-29 7 views
33

Ich verwende FOSUserBundle, um meine Benutzer zu authentifizieren.Symfony2: Wie Benutzerobjekt in Controller erhalten, wenn Sie FOSUserBundle verwenden?

Ich versuche, das Benutzerobjekt innerhalb des Controllers zu bekommen, um eine Reise zu registrieren, wo ich das Benutzerobjekt zu dieser Reise vor dem Speichern hinzufügen sollte.

habe ich nicht gefunden, wie denn nächste Methode zu tun, wo ich es in symfony doc gefunden:

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

den Benutzernamen als String macht, aber ich brauche das ganze Objekt.

Derzeit verwende ich diese Methode, aber es funktioniert nicht richtig.

$username = $this->container->get('security.context')->getToken()->getUser(); 
$em = $this->container->get('doctrine')->getEntityManager(); 
$user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username); 

Wie kann ich das richtig machen?

Antwort

66

Ich denke, Ramon ist richtig. Sie haben bereits das Benutzerobjekt.

Auch in Symfony> 2.1.x können Sie

$this->getUser(); 

in der Steuerung verwenden.

14

Die Dokumentation für die getUser Methode zeigt:

entweder gibt ein Objekt, das zurück __toString() oder ein primitiver Zeichenfolge implementiert wird.

Und wenn wir in der FOS\UserBundle\Model\User Klasse über here (die Basisbenutzerklasse durch die FOSUserBundle verwendet) zu buchen, können wir sehen, dass es in der Tat eine __toString Methode hat:

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

denke ich, dass Sie tatsächlich Holen Sie sich das User Objekt, aber weil es eine __toString Methode implementiert, kann es direkt in Vorlagen gerendert werden.

In Zweig können Sie:

{{ dump(user) }} 

Um zu sehen, welche Art von Objekt, das Sie haben. Aber Sie verwenden tatsächlich ein Objekt, keine Zeichenfolge.

8

Lösung:

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

anscheinend es tut genau das gleiche wie ein integrierte Methode getUser() – Sejanus

1

ich hatte das gleiche Problem, lösen sie die FOS-Klassen in Ihrem Nutzbereich also hinzufügen:

use FOS\UserBundle\FOSUserEvents; 
use FOS\UserBundle\Event\GetResponseUserEvent; 
use FOS\UserBundle\Model\UserInterface; 
3

In FOSUser 1.3 Sie können nicht direkt $this->getUser rufen in Sicherheitscontroller.

Sie haben $this->container->get('security.context')->getToken()->getUser();

nennen Und das ist genug, um das Benutzerobjekt zuzugreifen. Keine Notwendigkeit zu nennen $user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);

Weiterhin Ihre find Verfahren automatisch und implizit Ihr erstes $ username Objekt String werfen, weil es nicht ein Objekt als Argument nicht warten.

0

Für FOSUser^1.3 Sie können aus dem Inneren eines Controller aktuellen Benutzers erhalten, die Base wie folgt erweitert:

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