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

Posted

技术标签:

【中文标题】Symfony2:使用 FOSUserBundle 时如何在控制器内获取用户对象?【英文标题】:Symfony2: How to get user Object inside controller when using FOSUserBundle? 【发布时间】:2012-09-21 07:19:47 【问题描述】:

我正在使用 FOSUserBundle 对我的用户进行身份验证。

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

我没有找到如何做到这一点,因为我在 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);

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

【问题讨论】:

【参考方案1】:

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

也可以在 Symfony > 2.1.x 中使用

$this->getUser();

在控制器内部。

【讨论】:

【参考方案2】:

getUser 方法的文档表明:

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

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

public function __toString()

    return (string) $this->getUsername();

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

在 Twig 中你可以使用:

 dump(user) 

看看你有什么样的对象。但是您实际上使用的是对象,而不是字符串。

【讨论】:

【参考方案3】:

解决方案:

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

【讨论】:

显然它与内置方法 getUser() 完全相同【参考方案4】:

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

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

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

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

【讨论】:

【参考方案5】:

我遇到了同样的问题,要解决它,请在您的使用部分添加 FOS 类,即:

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

【讨论】:

【参考方案6】:

在 symfony >= 3.2 中,documentation 声明:

在控制器中获取当前用户的另一种方法是 使用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 base controller,不要使用ControllerTrait 任何一个。否则,建议继续使用 getUser() 快捷方式。

Here is blog post关于它

【讨论】:

【参考方案7】:

对于 FOSUser ^1.3,您可以从扩展 BaseController 的控制器内部获取当前用户,如下所示:

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

【讨论】:

【参考方案8】:
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');

【讨论】:

以上是关于Symfony2:使用 FOSUserBundle 时如何在控制器内获取用户对象?的主要内容,如果未能解决你的问题,请参考以下文章

FOSUserBundle 使用电子邮件登录 (Symfony2)

使用 FOSUserBundle 自动登录 Symfony2 [重复]

Symfony2:FOSUserBundle 删除操作错误

Symfony2 多 FosUserBundle

使用 FosUserBundle symfony2 管理多个角色

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