entity framework - hacer - ¿Cómo obtengo la entidad que representa al usuario actual en Symfony2?
roles en symfony2 (6)
Mejores prácticas
De acuerdo con la documentación desde Symfony 2.1, simplemente use este atajo:
$user = $this->getUser();
Lo anterior todavía está funcionando en Symfony 3.2 y es un atajo para esto:
$user = $this->get(''security.token_storage'')->getToken()->getUser();
El servicio
security.token_storage
se introdujo en Symfony 2.6. Antes de Symfony 2.6, tenías que usar elgetToken()
del serviciosecurity.context
.
Ejemplo : Y si quiere directamente el nombre de usuario:
$username = $this->getUser()->getUsername();
Si el tipo de clase de usuario es incorrecto
El usuario será un objeto y la clase de ese objeto dependerá de su proveedor de usuario .
Estoy usando la configuración de seguridad de Symfony. Todo funciona bien, pero no sé cómo hacer una cosa importante:
En twig, puedo llegar a la información del usuario actual haciendo:
Welcome, {{ app.user.username }}
o similar
¿Cómo accedo a esta misma información en el controlador? Específicamente, quiero obtener la entidad de usuario actual para poder almacenarla relacionalmente en otra entidad (mapeo de uno a uno).
Realmente estaba esperando que fuera
$this->get(''security.context'')->getToken()->getUser()
pero eso no funciona. Me da una clase de tipo
Symfony/Component/Security/Core/User/User
y quiero uno de tipo
Acme/AuctionBundle/Entity/User
cual es mi entidad ...
Bueno, primero necesita solicitar el nombre de usuario del usuario de la sesión en su acción de controlador de esta manera:
$username=$this->get(''security.context'')->getToken()->getUser()->getUserName();
a continuación, haga una consulta al DB y obtenga su objeto con DQL regular como
$em = $this->get(''doctrine.orm.entity_manager'');
"SELECT u FROM Acme/AuctionBundle/Entity/User u where u.username=".$username;
$q=$em->createQuery($query);
$user=$q->getResult();
el usuario $ debería ahora retener al usuario con este nombre de usuario (también podría usar otros campos por supuesto)
... pero primero tendrá que configurar su configuración de /app/config/security.yml para usar el campo apropiado para su proveedor de seguridad de la siguiente manera:
security:
provider:
example:
entity: {class Acme/AuctionBundle/Entity/User, property: username}
¡espero que esto ayude!
Como dice ktolis, primero debes configurar tu /app/config/security.yml
.
Entonces con
$usr= $this->get(''security.context'')->getToken()->getUser();
$usr->getUsername();
debería ser enougth!
$ usr es su objeto de usuario! No necesita volver a consultarlo.
Descubra la manera de configurar sus proveedores en security.yml
desde Sf2 Documentation y vuelva a intentarlo.
¡La mejor de las suertes!
EDIT: desde symfony 2.6, el servicio security.context
está en desuso, use el servicio security.token_storage
como:
$this->get(''security.token_storage'')->getToken()->getUser()
El hilo es un poco viejo, pero creo que esto probablemente podría salvarle el tiempo a alguien ...
Me encontré con el mismo problema que la pregunta original, que el tipo se muestra como Symfony / Component / Security / Core / User / User
Eventualmente resultó que estaba conectado usando un usuario de memoria
mi security.yml se parece a esto
security:
providers:
chain_provider:
chain:
providers: [in_memory, fos_userbundle]
fos_userbundle:
id: fos_user.user_manager
in_memory:
memory:
users:
user: { password: userpass, roles: [ ''ROLE_USER'' ] }
admin: { password: adminpass, roles: [ ''ROLE_ADMIN'', ''ROLE_SONATA_ADMIN'' ] }
el tipo de usuario in_memory siempre es Symfony / Component / Security / Core / User / User si desea usar su propia entidad, inicie sesión utilizando el usuario de ese proveedor.
Gracias, hj
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 ().
Publicación del blog al respecto
$this->container->get(''security.token_storage'')->getToken()->getUser();