Ответ 1
Я думаю, что Ramon прав. У вас уже есть пользовательский объект.
Также в Symfony > 2.1.x вы можете использовать
$this->getUser();
внутри контроллера.
Я использую 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 в ваш раздел использования i.e:
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Model\UserInterface;
В 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().
Вот сообщение в блоге об этом
Для 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');
}
Преобразование любого объекта в используемую строку (string) example (string) $this-> getUser();