Как получить текущего зарегистрированного пользователя в сервисе

В Symfony 2.8/3.0 с нашими новыми новыми компонентами безопасности, как мне получить текущий зарегистрированный объект User (то есть FOSUser) в сервисе без, который вводит весь контейнер?

Возможно ли это даже без хаки?

PS: Не считайте "передайте его служебной функции как параметр" для того, чтобы быть тривиально очевидным. Кроме того, грязный.

Ответ 2

Используя инъекцию зависимости конструктора, вы можете сделать это следующим образом:

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);
    }
}

Ответ 4

В symfo 4:

use Symfony\Component\Security\Core\Security;

class ExampleService
{
    private $security;

    public function __construct(Security $security)
    {
        $this->security = $security;
    }

    public function someMethod()
    {
        $user = $this->security->getUser();
    }
}

Смотрите документ: https://symfony.com/doc/current/security.html#retrieving-the-user-object

Ответ 6

Symfony делает это в 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;
}

Итак, если вы просто введете и замените security.token_storage, вам будет хорошо.

Ответ 7

если вы расширяете класс контроллера

$this->get('security.context')->getToken()->getUser();

Или, если у вас есть доступ к элементу контейнера.

$container = $this->configurationPool->getContainer();
$user = $container->get('security.context')->getToken()->getUser();

http://symfony.com/blog/new-in-symfony-2-6-security-component-improvements