Symfony2:Как получить пользовательский объект внутри контроллера при использовании FOSUserBundle?
-
11-12-2019 - |
Вопрос
Я использую 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);
Как я могу правильно это сделать?
Решение
Я думаю, Ramon - это верно.У вас уже есть объект пользователя.
также в Symfony> 2.1.x Вы можете использовать
$this->getUser();
.
внутри контроллера.
Другие советы
Документация для getUser
метод указывает:
либо возвращается объект, который реализует __toString(), либо возвращается примитивная строка.
И если мы заглянем в FOS\UserBundle\Model\User
урок окончен здесь (базовый пользовательский класс, используемый FOSUserBundle) мы можем видеть, что у него действительно есть __toString
метод:
public function __toString()
{
return (string) $this->getUsername();
}
Я думаю, что вы действительно получаете User
объект, но поскольку он реализует __toString
метод, который может быть отрисован непосредственно в шаблонах.
В Twig вы можете использовать:
{{ 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 в вашем использовании Section I.E:
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Model\UserInterface;
. в Symfony>= 3.2, Документация утверждает, что:
Альтернативный способ получить текущий пользователь в контроллере Тип-подсказка Контроллер Аргумент с 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 и don ' T Используйте ControlLertrait либо. В противном случае рекомендуется использовать использование GetUser () ярлык.
для fosuser ^ 1.3 Вы можете получить текущий пользователь изнутри контроллера, который расширяет базовый контроллер, как это:
$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');
}
.