Symfony2:¿Cómo conseguir que el objeto de usuario esté dentro del controlador cuando se utiliza FOSUserBundle?
-
11-12-2019 - |
Pregunta
Estoy usando FOSUserBundle para autenticar a mis usuarios.
Estoy intentando que el objeto de usuario dentro del Controlador registre un viaje donde debo agregar el objeto de usuario a este Viaje antes de guardar.
No encontré cómo hacerlo porque el siguiente método lo encontré en Symfony doc:
$user = $this->container->get('security.context')->getToken()->getUser();
representa el nombre de usuario como una cadena, pero necesito el objeto completo.
Actualmente utilizo este método, pero no funciona correctamente.
$username = $this->container->get('security.context')->getToken()->getUser();
$em = $this->container->get('doctrine')->getEntityManager();
$user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);
¿Cómo puedo hacer esto correctamente?
Solución
Creo que Ramon tiene razón.Ya tienes el objeto de usuario.
también en Symfony> 2.1.x puede usar
$this->getUser();
dentro del controlador.
Otros consejos
La documentación para el getUser
método indica:
Devuelve un objeto que implementa __toString() o se devuelve una cadena primitiva.
Y si miramos en el FOS\UserBundle\Model\User
clase terminada aquí (la clase de usuario base utilizada por FOSUserBundle) podemos ver que efectivamente tiene una __toString
método:
public function __toString()
{
return (string) $this->getUsername();
}
Creo que realmente entiendes User
objeto sino porque implementa un __toString
método, se puede representar directamente en plantillas.
En Twig puedes usar:
{{ dump(user) }}
Para ver qué tipo de objeto tienes.Pero en realidad estás usando un objeto, no una cadena.
Solución:
$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->findUserByUsername($this->container->get('security.context')
->getToken()
->getUser())
En FOSUser 1.3 no puedes llamar directamente $this->getUser
en Controlador de seguridad.
tienes que llamar $this->container->get('security.context')->getToken()->getUser();
Y esto es suficiente para acceder al objeto de usuario.No es necesario llamar $user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);
Además tu find
El método convierte automática e implícitamente su objeto $username inicial a una cadena porque no espera un objeto como argumento.
Tuve el mismo problema, para resolverlo Agregar las clases FOS en la sección de Uso I.E:
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Model\UserInterface;
en Symfony>= 3.2, Documentación dice que:
Una forma alternativa de obtener al usuario actual en un controlador es para Escriba el argumento del controlador con usuariointerface (y por defecto a nulo si está iniciando sesión es opcional):
use Symfony\Component\Security\Core\User\UserInterface\UserInterface; public function indexAction(UserInterface $user = null) { // $user is null when not logged-in or anon. }
Esto solo se recomienda para desarrolladores experimentados que no se extienden desde la Controlador base de Symfony y Don ' t Use la ControllerTrait ya sea. De lo contrario, se recomienda seguir usando el GetUser () atajo.
Para FOSUSER ^ 1.3 Puede obtener al usuario actual desde dentro de un controlador que extiende la base de control como este:
$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');
}