Подтвердить что ты не робот

Symfony2: Как получить пользовательский объект внутри контроллера при использовании FOSUserBundle?

Я использую FOSUserBundle для аутентификации моих пользователей.

Я пытаюсь получить объект пользователя внутри Контроллера, чтобы зарегистрировать поездку, где я должен добавить объект пользователя в эту поездку до сохранения.

Я не нашел, как это сделать, потому что следующий метод, где я нашел его в symfony doc:

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

отображает имя пользователя как строку, но мне нужен весь объект.

В настоящее время я использую этот метод, но он не работает должным образом.

$username = $this->container->get('security.context')->getToken()->getUser();
$em = $this->container->get('doctrine')->getEntityManager();
$user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);

Как я могу правильно это сделать?

4b9b3361

Ответ 1

Я думаю, что Ramon прав. У вас уже есть пользовательский объект.

Также в Symfony > 2.1.x вы можете использовать

$this->getUser();

внутри контроллера.

Ответ 2

Документация для метода getUser указывает:

возвращает объект, реализующий __toString(), или возвращает примитивную строку.

И если мы посмотрим в классе FOS\UserBundle\Model\User над здесь (базовый пользовательский класс, используемый FOSUserBundle), мы видим, что он действительно имеет __toString метод:

public function __toString()
{
    return (string) $this->getUsername();
}

Я думаю, что вы фактически получаете объект User, но поскольку он реализует метод __toString, он может быть отображен непосредственно в шаблонах.

В Twig вы можете использовать:

{{ dump(user) }}

Чтобы узнать, какой у вас объект. Но вы фактически используете объект, а не строку.

Ответ 3

Решение:

$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->findUserByUsername($this->container->get('security.context')
                    ->getToken()
                    ->getUser())

Ответ 4

В FOSUser 1.3 вы не можете напрямую вызвать $this->getUser в SecurityController.

Вам нужно позвонить $this->container->get('security.context')->getToken()->getUser();

И этого достаточно для доступа к объекту пользователя. Не нужно звонить $user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);

Кроме того, ваш метод find автоматически и неявно передает ваш исходный объект $username в строку, потому что он не ждет объект как аргумент.

Ответ 5

У меня была такая же проблема, чтобы разрешить это, добавьте классы FOS в ваш раздел использования i.e:

use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Model\UserInterface;

Ответ 6

В 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().

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

Ответ 7

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

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

Ответ 8

public function indexAction()
{
    /* @var $user \FOS\UserBundle\Model\UserInterface */
    if ($user = $this->getUser())
    {
        echo '<pre>';
        print_r($user);
        print_r($user->getRoles()); // method usage example

        exit;

        return $this->redirectToRoute('dashboard');
    }

    return $this->redirectToRoute('login');
}

Ответ 9

Преобразование любого объекта в используемую строку (string) example (string) $this-> getUser();