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

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

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

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

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

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

8 ответов


Я думаю Рамон - Это верно. У вас уже есть объект пользователя.

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

$this->getUser();

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


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

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

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

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

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

в веточке вы можете использовать:

{{ dump(user) }}

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


устранение:

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

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

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

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

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


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

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

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

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

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() ярлык.

вот блог об этом


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

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

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