37

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

我试图让控制器内的用户对象注册一次旅行,我应该在保存之前将用户对象添加到此旅行。

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

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

4

8 回答 8

73

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

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

$this->getUser();

控制器内部。

于 2013-03-06T01:00:17.557 回答
15

getUser方法的文档表明:

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

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

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

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

在 Twig 中,您可以使用:

{{ dump(user) }}

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

于 2012-09-30T18:34:31.693 回答
9

解决方案:

$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->findUserByUsername($this->container->get('security.context')
                    ->getToken()
                    ->getUser())
于 2013-06-08T21:10:15.550 回答
3

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

你必须打电话$this->container->get('security.context')->getToken()->getUser();

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

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

于 2016-06-09T23:58:58.100 回答
2

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

use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Model\UserInterface;
于 2014-03-05T13:07:52.723 回答
2

在 symfony >= 3.2 中,文档指出:

在控制器中获取当前用户的另一种方法是使用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 基本控制器扩展并且也不使用ControllerTrait的有经验的开发人员 。否则,建议继续使用 getUser() 快捷方式。

这是关于它的博客文章

于 2018-03-29T07:42:03.377 回答
0

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

$user = $this->container->get('security.token_storage')->getToken()->getUser();
于 2017-09-30T05:57:45.950 回答
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');
}
于 2018-08-20T14:02:46.537 回答