Symfony2:Como obter o Objeto de usuário no interior do controlador ao utilizar FOSUserBundle?

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

  •  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?

Foi útil?

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');
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top