Symfony获取已登录用户的ID

56
我正在使用Symfony2和Doctrine 2开发一个应用程序,想知道如何获取当前已登录用户的ID。

在Symfony2.1控制器中,您可以通过调用$this->getUser()来获取用户。我认为这是Symfony的新版本。 - pmoubed
4个回答

141

当前的Symfony版本(Symfony 4,Symfony >=3.2)

自从Symfony >=3.2版本起,你可以直接在控制器操作中注入UserInterface实现,然后调用getId()方法来获取用户标识:

class DefaultController extends Controller
{
    // when the user is mandatory (e.g. behind a firewall)
    public function fooAction(UserInterface $user)
    {
        $userId = $user->getId(); 
    }

    // when the user is optional (e.g. can be anonymous)
    public function barAction(UserInterface $user = null) 
    {
        $userId = null !== $user ? $user->getId() : null;
    }
}

自从Symfony 2.6版本以来,您仍然可以像以前一样使用安全令牌存储。例如,在您的控制器中:

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

请注意,下一部分回答中提到的Controller::getUser() 快捷方式已不再被鼓励使用。

旧版Symfony

访问用户的最简单方法是扩展基本控制器并使用快捷方式getUser() 方法:

$user = $this->getUser();

自从Symfony 2.6版本以后,你可以从安全令牌存储中检索用户:

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

Symfony 2.6之前,令牌可以从安全上下文服务中访问:

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

请注意,在Symfony 2中,安全上下文服务已被弃用,并在Symfony 3.0中删除。


2
不错的回答。要从用户对象中获取其他字段,例如电子邮件、名字或性别,请使用以下方式。要获取性别,请使用 echo 'Gender is : ' . $user->getGender(); - webblover
自2.6版本起已被弃用,将在3.0中移除! - Zagloo
根据文档,Symfony 4+仍然使用getUser():https://symfony.com/doc/current/security.html#a-fetching-the-user-object - user1392897
@Zagloo,我刚在我的Symfony 5中的控制器中使用了“UserInterface”,它的效果正如预期。 - Ali

17
在Symfony2中,我们可以通过以下代码更简单地实现此操作:
$id = $this->getUser()->getId();

5
您可以使用以下代码获取变量:
$userId = $this->get('security.context')->getToken()->getUser()->getId();

1
不良实践,变量名应该是 $userId - GusDeCooL

0

这可以在方法中实现:

/**
 * Get user id
 * @return integer $userId
 */
protected function getUserId()
{
    $user = $this->get('security.context')->getToken()->getUser();
    $userId = $user->getId();

    return $userId;
}

并获取 $this->getUserId() 的归纳

public function example()
{
    print_r($this->getUserId()); 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接