symfony2 - symfony hash
Symfony2: ¿Cómo obtener el objeto del usuario dentro del controlador cuando se usa FOSUserBundle? (7)
Estoy usando FOSUserBundle para autenticar a mis usuarios.
Estoy intentando que el objeto del usuario dentro del controlador registre un viaje en el que debería agregar el objeto del usuario a este viaje antes de guardarlo.
No encontré cómo hacerlo porque el siguiente método donde lo encontré en Symfony Doc:
$user = $this->container->get(''security.context'')->getToken()->getUser();
representa el nombre de usuario como cadena, pero necesito el objeto completo.
Actualmente, uso 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?
Creo que Ramon tiene razón. Ya tienes el objeto de usuario.
También en Symfony> 2.1.x puedes usar
$this->getUser();
dentro del controlador.
En FOSUser 1.3 no puede llamar directamente $this->getUser
en SecurityController.
Tienes que llamar a $this->container->get(''security.context'')->getToken()->getUser();
Y esto es suficiente para acceder al objeto del usuario. No es necesario llamar a $user = $em->getRepository(''SiteUtilisateurBundle:Utilisateur'')->find($username);
Además, su método Find emite automática e implícitamente su objeto $ username inicial a la cadena porque no espera un objeto como argumento.
En Symfony> = 3.2, la documentation indica que:
Una forma alternativa de obtener el usuario actual en un controlador es tipear-insinuar el argumento del controlador con UserInterface (y por defecto es nulo si el inicio de 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 el controlador base de Symfony y tampoco usan ControllerTrait . De lo contrario, se recomienda seguir utilizando el acceso directo getUser ().
Aquí hay una publicación en el blog sobre eso
La documentación para el método getUser
indica:
cualquiera devuelve un objeto que implementa __toString (), o se devuelve una cadena primitiva.
Y si buscamos en la clase FOS/UserBundle/Model/User
here (la clase de usuario base utilizada por FOSUserBundle) podemos ver que sí tiene un método __toString
:
public function __toString()
{
return (string) $this->getUsername();
}
Creo que en realidad obtienes el objeto User
pero como implementa un método __toString
, se puede representar directamente en las 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.
Para FOSUser ^ 1.3 puede obtener el usuario actual desde dentro de un controlador que amplíe BaseController de esta manera:
$user = $this->container->get(''security.token_storage'')->getToken()->getUser();
Solución:
$userManager = $this->container->get(''fos_user.user_manager'');
$user = $userManager->findUserByUsername($this->container->get(''security.context'')
->getToken()
->getUser())
Tuve el mismo problema, para resolverlo agregue las clases de FOS en su sección de uso, es decir:
use FOS/UserBundle/FOSUserEvents;
use FOS/UserBundle/Event/GetResponseUserEvent;
use FOS/UserBundle/Model/UserInterface;