it-swarm.com.de

Symfony2: Wie erhält man ein Benutzerobjekt im Controller bei Verwendung von FOSUserBundle

Ich verwende FOSUserBundle, um meine Benutzer zu authentifizieren.

Ich versuche, das Benutzerobjekt in der Steuerung dazu zu bringen, eine Reise zu registrieren, bei der ich das Benutzerobjekt vor dem Speichern zu dieser Reise hinzufügen soll.

Ich habe nicht gefunden, wie das geht, weil die nächste Methode, wo ich sie in symfony doc gefunden habe:

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

rendert den Benutzernamen als Zeichenfolge, aber ich brauche das gesamte Objekt.

Derzeit verwende ich diese Methode, aber sie 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?

36
skonsoft

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

Auch in Symfony> 2.1.x können Sie verwenden 

$this->getUser();

im Controller. 

70
Mohammad Niknam

Die Dokumentation der getUser-Methode gibt an:

gibt entweder ein Objekt zurück, das __toString () implementiert, oder es wird eine primitive Zeichenfolge zurückgegeben.

Und wenn wir in der FOS\UserBundle\Model\User-Klasse über here (die von FOSUserBundle verwendete Basisbenutzerklasse) nachsehen, können wir feststellen, dass sie tatsächlich eine __toString-Methode hat:

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

Ich denke, dass Sie tatsächlich das User-Objekt erhalten, aber da es eine __toString-Methode implementiert, kann es direkt in Vorlagen gerendert werden.

In Twig können Sie verwenden:

{{ dump(user) }}

Um zu sehen, was für ein Objekt du hast. Sie verwenden jedoch tatsächlich ein Objekt, keine Zeichenfolge.

15
Ramon Kleiss

Lösung:

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

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

Sie müssen $this->container->get('security.context')->getToken()->getUser(); anrufen

Und das ist genug, um auf das Benutzerobjekt zuzugreifen. Kein Aufruf von $user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);

Außerdem wandelt Ihre find-Methode Ihr ursprüngliches $ username-Objekt automatisch und implizit in eine Zeichenfolge um, da es kein Objekt als Argument wartet.

3
Tsounabe

Ich hatte das gleiche Problem, um das Problem zu beheben, fügen Sie die FOS-Klassen in Ihrem Verwendungsabschnitt hinzu.

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

In symfony> = 3.2 gibt documentation Folgendes an:

Eine alternative Methode, um den aktuellen Benutzer in einem Controller abzurufen, ist die Verwendung von Typ-Hinweis das Controller-Argument mit UserInterface (und standardmäßig auf Null gesetzt, wenn es optional ist):

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

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

Dies ist nur für erfahrene Entwickler zu empfehlen, die nicht .__ erweitern. vom Symfony-Basiscontroller und nicht das ControllerTrait .__ verwenden. entweder. Andernfalls wird empfohlen, getUser () .__ weiter zu verwenden. Abkürzung.

Hier ist ein Blogbeitrag darüber

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

Für FOSUser ^ 1.3 können Sie den aktuellen Benutzer aus einem Controller herausholen, der BaseController wie folgt erweitert:

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