Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Symfony2: How to get user Object inside controller when using FOSUserBundle?

I'm using FOSUserBundle to authenticate my users.

I'm trying to get the user object inside the Controller to register a trip where I should add the user object to this Trip before save.

I did not found how to do that because next method where I found it in symfony doc:

$user = $this->container->get('security.context')->getToken()->getUser();

renders the username as string, but I need the whole object.

Currently, I use this method, but it's not working properly.

$username = $this->container->get('security.context')->getToken()->getUser();
$em = $this->container->get('doctrine')->getEntityManager();
$user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);

How can I correctly do this?

like image 805
skonsoft Avatar asked Sep 29 '12 20:09

skonsoft


4 Answers

I think Ramon is right. You already have the user object.

Also in Symfony > 2.1.x you can use

$this->getUser();

inside the controller.

like image 187
Mohammad Niknam Avatar answered Nov 04 '22 23:11

Mohammad Niknam


The documentation for the getUser method indicates:

either returns an object which implements __toString(), or a primitive string is returned.

And if we look in the FOS\UserBundle\Model\User class over here (the base user class used by the FOSUserBundle) we can see that it does indeed have a __toString method:

public function __toString()
{
    return (string) $this->getUsername();
}

I think that you actually get the User object but because it implements a __toString method it can be rendered directly in templates.

In Twig you can use:

{{ dump(user) }}

To see what kind of object you have. But You are actually using an object, not a string.

like image 24
Ramon Kleiss Avatar answered Nov 05 '22 00:11

Ramon Kleiss


Solution:

$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->findUserByUsername($this->container->get('security.context')
                    ->getToken()
                    ->getUser())
like image 9
karda Avatar answered Nov 04 '22 23:11

karda


In FOSUser 1.3 you can't call directly $this->getUser in SecurityController.

You have to call $this->container->get('security.context')->getToken()->getUser();

And this is enough to access the user object. No need to call $user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);

Furthermore your find method automatically and implicitly cast your initial $username object to string because it doesn't wait an object as argument.

like image 3
Tsounabe Avatar answered Nov 05 '22 00:11

Tsounabe