the symfony2 node must fos_user fos db_driver configured child symfony fosuserbundle

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;