Как получить сущность, которая представляет текущего пользователя в Symfony2? - PullRequest
121 голосов
/ 07 октября 2011

Я использую настройки безопасности Symfony.Все работает нормально, но я не знаю, как сделать одну важную вещь:

В ветке я могу получить информацию о текущем пользователе, выполнив:

Welcome, {{ app.user.username }}

или аналогичный

Как мне получить доступ к этой же информации в контроллере?В частности, я хочу получить текущий пользовательский объект, чтобы я мог сохранить его реляционно в другом объекте (сопоставление один к одному).

Я действительно надеялся, что это будет

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

но это не работаетЭто дает мне класс типа

Symfony\Component\Security\Core\User\User

, и я хочу один из типов

Acme\AuctionBundle\Entity\User

, который является моей сущностью ....

Ответы [ 6 ]

191 голосов
/ 07 октября 2011

Как говорит Ктолис, сначала нужно настроить /app/config/security.yml.

Затем с

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

должно быть достаточно!

$ usr это ваш пользовательский объект!Вам не нужно запрашивать его снова.

Узнайте, как настроить своих провайдеров в security.yml из Документация Sf2 и повторите попытку.

Удачи!


РЕДАКТИРОВАТЬ: из symfony 2.6, security.context служба устарела, используйте службу security.token_storage как:

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

РЕДАКТИРОВАТЬ SF4:

В Symfony 4 (возможно, также 3.3, но только в 4 проверено реальным) вы можете внедрить сервис Security через автоподключение в контроллере вот так:

use Symfony\Component\Security\Core\Security;

public function privatePage( Security $security ) : Response
{
    $user = $security->getUser();
    // ... do whatever you want with $user
}
61 голосов
/ 28 апреля 2014

Лучшая практика

Согласно документации , так как Symfony 2.1 просто использует этот ярлык:

$user = $this->getUser();

Выше указано , все еще работающее с Symfony 3.2 и является сокращением для этого:

$user = $this->get('security.token_storage')->getToken()->getUser();

Служба security.token_storage была введена в Symfony 2.6.До Symfony 2.6 вам приходилось использовать метод getToken() службы security.context.

Пример : И если вы хотите напрямую указать имя пользователя:

$username = $this->getUser()->getUsername();

Если указан неправильный тип пользовательского класса

Пользователь будет объектом, и класс этого объекта будет зависеть от вашего провайдера пользователя .

6 голосов
/ 27 ноября 2013

Поток устарел, но я думаю, что это могло бы сэкономить чье-то время ...

Я столкнулся с той же проблемой, что и исходный вопрос, что тип показан как Symfony \ Component \ Security \Core \ User \ User

В итоге оказалось, что я вошел в систему, используя пользователя в памяти

my security.yml выглядит примерно так

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' ] }

in_memoryтип пользователя всегда Symfony \ Component \ Security \ Core \ User \ User, если вы хотите использовать свою собственную сущность, войдите в систему, используя пользователя этого провайдера.

Спасибо, hj

3 голосов
/ 29 марта 2018

В symfony> = 3.2, документация гласит:

Альтернативный способ получить текущего пользователя в контроллере - это подсказка типа аргумент контроллера с UserInterface (и по умолчанию это в ноль, если вход в систему необязателен):

use Symfony\Component\Security\Core\User\UserInterface\UserInterface;

public function indexAction(UserInterface $user = null)
{
    // $user is null when not logged-in or anon.
}

Это рекомендуется только для опытных разработчиков, которые не расширяют от базового контроллера Symfony и не используйте ControllerTrait или. В противном случае рекомендуется продолжать использовать getUser () ярлык.

Сообщение в блоге об этом

2 голосов
/ 04 августа 2016
$this->container->get('security.token_storage')->getToken()->getUser();
0 голосов
/ 07 октября 2011

Что ж, сначала вам нужно запросить имя пользователя пользователя из сеанса в вашем действии контроллера следующим образом:

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

, затем сделать запрос к БД и получить ваш объект с обычным dql, подобным

$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();

$ user теперь должен содержать пользователя с этим именем пользователя (вы, конечно, можете использовать и другие поля)

... но вам сначала нужно будет настроить / app / config/security.yml, чтобы использовать соответствующее поле для вашего провайдера безопасности, например так:

security:
 provider:
  example:
   entity: {class Acme\AuctionBundle\Entity\User, property: username}

надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...