2012-09-29 7 views
33

Sto utilizzando FOSUserBundle per autenticare i miei utenti.Symfony2: Come ottenere l'oggetto utente all'interno del controller quando si utilizza FOSUserBundle?

Sto cercando di ottenere l'oggetto utente all'interno del controller per registrare un viaggio in cui dovrei aggiungere l'oggetto utente a questo viaggio prima di salvare.

non ho trovato come fare perché il metodo successivo, dove ho trovato in symfony doc:

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

rende il nome utente come stringa, ma ho bisogno di tutto l'oggetto.

Attualmente, utilizzo questo metodo, ma non funziona correttamente.

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

Come posso farlo correttamente?

risposta

66

Penso che Ramon abbia ragione. Hai già l'oggetto utente.

anche in Symfony> 2.1.x è possibile utilizzare

$this->getUser(); 

all'interno del controllore.

14

La documentazione per il metodo getUser indica:

sia restituisce un oggetto che implementa __toString(), oppure viene restituito una stringa primitiva.

E se guardiamo nel FOS\UserBundle\Model\User Classe in here (classe utente di base utilizzato dal FOSUserBundle) possiamo vedere che essa ha in effetti un metodo __toString:

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

Penso che in realtà ottenere l'oggetto User ma poiché implementa un metodo __toString può essere visualizzato direttamente nei modelli.

In Twig è possibile utilizzare:

{{ dump(user) }} 

per vedere che tipo di oggetto che avete. Ma stai effettivamente usando un oggetto, non una stringa.

8

Soluzione:

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

a quanto pare fa esattamente la stessa di un metodo incorporato getUser() – Sejanus

1

ho avuto lo stesso problema, per risolvere il problema aggiungere le classi FOS nella tua sezione uso cioè:

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

In FOSUser 1.3 Non è possibile chiamare direttamente $this->getUser in SecurityController.

devi chiamare $this->container->get('security.context')->getToken()->getUser();

e questo è sufficiente per accedere all'oggetto utente. Non c'è bisogno di chiamare $user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);

Inoltre il metodo di find automaticamente ed implicitamente gettato l'oggetto iniziale di $ nome utente per stringa, perché non aspetta un oggetto come argomento.

0

Per FOSUser^1.3 si può ottenere l'utente corrente dall'interno di un controller che si estende BaseController come questo:

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