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

StackOverflow https://stackoverflow.com//questions/12656388

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

Вот пост блога < / a> Об этом

для 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');
}
.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top