Symfony2:Como obter o Objeto de usuário no interior do controlador ao utilizar FOSUserBundle?
-
11-12-2019 - |
Pergunta
Eu estou usando FOSUserBundle para autenticar os usuários.
Eu estou tentando obter o objeto de usuário no interior do Controlador para registrar uma viagem, onde eu deveria adicionar o objecto de utilizador para esta Viagem antes de salvar.
Eu não encontrei como fazer isso porque o próximo método onde o encontrei em symfony doc:
$user = $this->container->get('security.context')->getToken()->getUser();
compõe o nome de usuário como string, mas eu preciso de todo o objeto.
Atualmente, eu uso este método, mas ele não está funcionando corretamente.
$username = $this->container->get('security.context')->getToken()->getUser();
$em = $this->container->get('doctrine')->getEntityManager();
$user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);
Como posso fazer isso corretamente?
Solução
Eu acho Ramon é direito.Você já tem o objeto de usuário.
Também no Symfony > 2.1.x você pode usar
$this->getUser();
no interior do controlador.
Outras dicas
A documentação para a getUser
método indica:
retorna um objeto que implementa __toString(), ou uma primitiva de seqüência de caracteres é retornado.
E se olharmos para o FOS\UserBundle\Model\User
classe aqui (a base de classe de usuário utilizado pelo FOSUserBundle), podemos ver que ele de fato tem um __toString
método:
public function __toString()
{
return (string) $this->getUsername();
}
Eu acho que você realmente começar a User
objeto, mas porque ele implementa um __toString
o método pode ser processada diretamente em modelos.
Em Galho, você pode usar:
{{ dump(user) }}
Para ver de que tipo de objeto que você tem.Mas na verdade, Você está usando um objeto, não uma cadeia.
Solução:
$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->findUserByUsername($this->container->get('security.context')
->getToken()
->getUser())
Em FOSUser 1.3 você não pode chamar diretamente $this->getUser
em SecurityController.
Você tem que chamar $this->container->get('security.context')->getToken()->getUser();
E isso é o suficiente para acessar o objeto de usuário.Não há necessidade de ligar $user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);
Além disso, o seu find
método automaticamente e, implicitamente, seu elenco inicial de r $username objeto para a cadeia porque não esperar um objeto como argumento.
Eu tive o mesmo problema, para resolvê-lo adicionar a FOS classes em sua seção de uso eu.e:
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Model\UserInterface;
No symfony >= 3.2, documentação afirma que:
Uma forma alternativa de obter o atual usuário em um controlador de tipo-dica: o nome do controlador de argumento com UserInterface (e predefinição para null se a ser registrado é opcional):
use Symfony\Component\Security\Core\User\UserInterface\UserInterface; public function indexAction(UserInterface $user = null) { // $user is null when not logged-in or anon. }
Isto só é recomendado para programadores experientes que não estender do Symfony controlador de base e não use a ControllerTrait qualquer um.Caso contrário, recomenda-se continuar usando o getUser() atalho.
Aqui é post de blog sobre isso
Para FOSUser ^1.3 você pode obter atual do usuário dentro de um controller que se estende BaseController como este :
$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');
}