Symfony2:如何在使用FOSUserBundle时在控制器内获取用户对象?

时间:2012-09-29 20:49:21

标签: symfony fosuserbundle

我正在使用FOSUserBundle来验证我的用户。

我正在尝试获取Controller中的用户对象以注册一个行程,我应该在保存之前将用户对象添加到此Trip。

我没有找到怎么做,因为我在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);

我怎样才能正确地做到这一点?

8 个答案:

答案 0 :(得分:71)

我认为Ramon是正确的。您已拥有用户对象。

同样在Symfony> 2.1.x你可以使用

$this->getUser();

控制器内部。

答案 1 :(得分:15)

getUser方法的文档表明:

  

返回一个实现__toString()的对象,或者返回一个原始字符串。

如果我们查看FOS\UserBundle\Model\Userhere(FOSUserBundle使用的基本用户类),我们可以看到它确实有__toString方法:

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

我认为您实际上获得了User对象,但因为它实现了__toString方法,所以它可以直接在模板中呈现。

在Twig中你可以使用:

{{ dump(user) }}

要查看您拥有的对象类型。但你实际上是在使用一个对象,而不是一个字符串。

答案 2 :(得分:9)

解决方案:

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

答案 3 :(得分:3)

在FOSUser 1.3中,您无法直接在SecurityController中调用$this->getUser

您必须致电$this->container->get('security.context')->getToken()->getUser();

这足以访问用户对象。 无需致电$user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);

此外,您的find方法会自动并隐式地将您的初始$ username对象强制转换为字符串,因为它不会将对象作为参数等待。

答案 4 :(得分:2)

我有同样的问题,要解决它在你的使用部分添加FOS类,即:

use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Model\UserInterface;

答案 5 :(得分:2)

在symfony> = 3.2中,documentation表示:

  

在控制器中获取当前用户的另一种方法是   type-hint控制器参数UserInterface(并默认为   如果登录是可选的,则为null):

<ProjectReference Include=”… foo.csproj”> 
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly> 
</ProjectReference>
     

仅适用于未扩展的有经验的开发人员   来自Symfony base controller并且不使用ControllerTrait   无论是。否则,建议继续使用getUser()   快捷方式。

Here is blog post关于它

答案 6 :(得分:0)

对于FOSU​​ser ^ 1.3,您可以从扩展BaseController的控制器中获取当前用户,如下所示:

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

答案 7 :(得分:0)

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');
}