Symfony2: Come ottenere l'oggetto utente all'interno del controller quando si utilizza FosuserBundle?
-
11-12-2019 - |
Domanda
Sto usando fosuserbundle per autenticare i miei utenti.
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 farlo perché il prossimo metodo dove l'ho trovato in symfony doc:
$user = $this->container->get('security.context')->getToken()->getUser();
.
rende il nome utente come stringa, ma ho bisogno dell'intero oggetto.
Attualmente, uso 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?
Soluzione
Penso che Ramon ha ragione.Hai già l'oggetto utente.
Anche in symfony> 2.1.x è possibile utilizzare
$this->getUser();
.
all'interno del controller.
Altri suggerimenti
La documentazione per il metodo getUser
indica:
.Restituisce un oggetto che implementa __ToString () o una stringa primitiva viene restituita.
E se guardiamo nella classe
FOS\UserBundle\Model\User
su qui (la classe di utenti di baseUtilizzato dal fosuserbundle) possiamo vedere che ha in effetti un metodo__toString
:.public function __toString() { return (string) $this->getUsername(); }
Penso che tu abbia effettivamente ricevuto l'oggetto
User
ma perché implementa un metodo__toString
può essere reso direttamente in modelli.in ramoscello puoi usare:
.{{ dump(user) }}
per vedere che tipo di oggetto hai.Ma stai effettivamente usando un oggetto, non una stringa.
Soluzione:
$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->findUserByUsername($this->container->get('security.context')
->getToken()
->getUser())
. 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 tuo metodo find
automaticamente e ha implicitamente il tuo oggetto iniziale di username $ per stringa perché non attende un oggetto come argomento.
Ho avuto lo stesso problema, per risolverlo aggiungi le classi FOS nella sezione dell'uso I.e:
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Model\UserInterface;
. in symfony>= 3.2, Documentazione afferma che:
.Un modo alternativo per ottenere l'utente corrente in un controller è Tipo-suggerimento dell'argomento del controller con UTILINERFACE (e predefinito a NULL se essere loggato è facoltativo):
.use Symfony\Component\Security\Core\User\UserInterface\UserInterface; public function indexAction(UserInterface $user = null) { // $user is null when not logged-in or anon. }
Questo è raccomandato solo per sviluppatori esperti che non si estendono Dal controller base symfony e don ' t Utilizzare il Controllertrait o. Altrimenti, si consiglia di continuare a utilizzare il getUser () collegamento.
Per il fosuser ^ 1.3 È possibile ottenere l'utente corrente dall'interno di un controller che estende il basecontroller come questo:
$user = $this->container->get('security.token_storage')->getToken()->getUser();
. 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');
}
.