symfony - Cómo obtener el usuario registrado actual en un servicio
symfony-2.8 (6)
En Symfony 2.8 / 3.0, con nuestros nuevos y sofisticados componentes de seguridad, ¿cómo obtengo el objeto de User
(por ejemplo, FOSUser ) registrado actualmente en un servicio sin inyectar todo el contenedor?
¿Es incluso posible de una manera no hacky ?
PD: No consideremos " pasarlo a la función de servicio como un parámetro " por ser trivialmente obvio. Además, sucio.
De Symfony 3.3
, solo de un Controlador , según esta publicación del blog: https://symfony.com/blog/new-in-symfony-3-2-user-value-resolver-for-controllers
Es fácil como:
use Symfony/Component/Security/Core/User/UserInterface
public function indexAction(UserInterface $user)
{...}
Inyecte el servicio security.token_storage
en su servicio y luego use:
$this->token_storage->getToken()->getUser();
como se describe aquí: http://symfony.com/doc/current/book/security.html#retrieving-the-user-object y aquí: http://symfony.com/doc/current/book/service_container.html#referencing-injecting-services
Symfony hace esto en Symfony / Bundle / FrameworkBundle / ControllerControllerTrait
protected function getUser()
{
if (!$this->container->has(''security.token_storage'')) {
throw new /LogicException(''The SecurityBundle is not registered in your application.'');
}
if (null === $token = $this->container->get(''security.token_storage'')->getToken()) {
return;
}
if (!is_object($user = $token->getUser())) {
// e.g. anonymous authentication
return;
}
return $user;
}
Entonces, si simplemente inyecta y reemplaza security.token_storage
, está listo.
Usando la inyección de dependencia del constructor, puedes hacerlo de esta manera:
use Symfony/Component/Security/Core/Authentication/Token/Storage/TokenStorageInterface;
class A
{
private $user;
public function __construct(TokenStorageInterface $tokenStorage)
{
$this->user = $tokenStorage->getToken()->getUser();
}
public function foo()
{
dump($this->user);
}
}
si tu clase se extiende de controlador
$this->get(''security.context'')->getToken()->getUser();
O bien, si tiene acceso al elemento contenedor ..
$container = $this->configurationPool->getContainer();
$user = $container->get(''security.context'')->getToken()->getUser();
http://symfony.com/blog/new-in-symfony-2-6-security-component-improvements
Nuevo en la versión 3.4: La clase de utilidad de seguridad se introdujo en Symfony 3.4.
use Symfony/Component/Security/Core/Security;
public function indexAction(Security $security)
{
$user = $security->getUser();
}