Как получить текущего зарегистрированного пользователя в сервисе
В Symfony 2.8/3.0 с нашими новыми новыми компонентами безопасности, как мне получить текущий зарегистрированный объект User
(то есть FOSUser) в сервисе без, который вводит весь контейнер?
Возможно ли это даже без хаки?
PS: Не считайте "передайте его служебной функции как параметр" для того, чтобы быть тривиально очевидным. Кроме того, грязный.
Ответы
Ответ 1
Внесите security.token_storage
услугу в свою службу, а затем используйте:
$this->token_storage->getToken()->getUser();
как описано здесь: http://symfony.com/doc/current/book/security.html#retrieving-the-user-object и здесь: http://symfony.com/doc/current/book/service_container.html#referencing-injecting-services
Ответ 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);
}
}
Ответ 3
Новое в версии 3.4: служебный класс Security был введен в Symfony 3.4.
use Symfony\Component\Security\Core\Security;
public function indexAction(Security $security)
{
$user = $security->getUser();
}
https://symfony.com/doc/3.4/security.html#always-check-if-the-user-is-logged-in
Ответ 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
Ответ 5
От Symfony 3.3
, от контроллера только, согласно этому сообщению в блоге: https://symfony.com/blog/new-in-symfony-3-2-user-value-resolver-for-controllers p >
Это легко:
use Symfony\Component\Security\Core\User\UserInterface
public function indexAction(UserInterface $user)
{...}
Ответ 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