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