Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony2:使用FOSUserBundle时如何在控制器内获取用户对象?_Symfony_Fosuserbundle - Fatal编程技术网

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

Symfony2:使用FOSUserBundle时如何在控制器内获取用户对象?,symfony,fosuserbundle,Symfony,Fosuserbundle,我正在使用FOSUserBundle对我的用户进行身份验证 我试图让控制器中的用户对象注册一个trip,在保存之前,我应该将用户对象添加到此trip中 我没有找到该如何做,因为我在symfony doc中找到的下一个方法是: $user = $this->container->get('security.context')->getToken()->getUser(); 将用户名呈现为字符串,但我需要整个对象 目前,我使用这种方法,但它不能正常工作 $username

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

我试图让控制器中的用户对象注册一个trip,在保存之前,我应该将用户对象添加到此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);

如何正确执行此操作?

getUser方法的文档指出:

返回实现_toString()的对象,或返回原语字符串

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

public function __toString()
{
    return (string) $this->getUsername();
}
我认为您实际上得到了
用户
对象,但由于它实现了
\uuu toString
方法,因此可以直接在模板中呈现

在Twig中,您可以使用:

{{ dump(user) }}
看看你有什么样的东西。但实际上您使用的是对象,而不是字符串。

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

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

$this->getUser();
在控制器内部

解决方案:

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

我也有同样的问题,为了解决这个问题,请在您的使用部分添加FOS类,即:

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

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

您必须调用
$this->container->get('security.context')->getToken()->getUser()

这就足够访问用户对象了。 无需调用
$user=$em->getRepository('siteUtisulateUrbundle:Utisulateur')->find($username)


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

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

$user = $this->container->get('security.token_storage')->getToken()->getUser();
在symfony>=3.2中,声明:

获取控制器中当前用户的另一种方法是 键入带有提示的控制器参数(并将其设置为默认值) 如果登录是可选的,则为null):

这只推荐给没有扩展经验的开发人员 从开始,不要使用 任何一个否则,建议继续使用getUser() 捷径

关于它

公共函数索引()
{
/*@var$user\FOS\UserBundle\Model\UserInterface*/
如果($user=$this->getUser())
{
回声';
打印(用户);
print_r($user->getRoles());//方法使用示例
出口
返回$this->redirectToRoute(“仪表板”);
}
返回$this->redirectToRoute('login');
}

显然,它的功能与内置方法getUser()完全相同
use Symfony\Component\Security\Core\User\UserInterface\UserInterface;

public function indexAction(UserInterface $user = null)
{
    // $user is null when not logged-in or anon.
}
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');
}