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 [重复]