Как получить объект, который представляет текущего пользователя в Symfony2?

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

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

Welcome, {{ app.user.username }}

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

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

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

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

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

Symfony\Component\Security\Core\User\User

и мне нужен один из типов

Acme\AuctionBundle\Entity\User

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

Ответ 1

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

Тогда с

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

должен быть enougth!

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

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

Удачи!


EDIT: из Symfony 2.6, security.context служба устарела, используйте security.token_storage службу как:

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

Ответ 2

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

Согласно документации, поскольку 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();

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

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

Ответ 3

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

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

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

мой 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

Ответ 4

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

Ответ 5

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

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

затем выполните запрос к db и получите ваш объект с регулярным 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();

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

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

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

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