如何在Symfony2中获取代表当前用户的实体?

Rob*_*tin 125 security entity-framework symfony

我正在使用Symfony安全设置.一切正常,但我不知道如何做一件重要的事情:

在twig中,我可以通过以下方式获取当前用户的信息:

Welcome, {{ app.user.username }}
Run Code Online (Sandbox Code Playgroud)

或类似的

如何在Controller中访问相同的信息?具体来说,我想获取当前用户实体,以便我可以将其关联存储在另一个实体中(一对一映射).

我真的希望它会

$this->get('security.context')->getToken()->getUser()
Run Code Online (Sandbox Code Playgroud)

但这不起作用.它给了我一类的类型

Symfony\Component\Security\Core\User\User
Run Code Online (Sandbox Code Playgroud)

我想要一个类型

Acme\AuctionBundle\Entity\User
Run Code Online (Sandbox Code Playgroud)

这是我的实体....

Cri*_*uce 197

正如ktolis所说,你首先必须配置你的/app/config/security.yml.

然后用

$usr= $this->get('security.context')->getToken()->getUser();
$usr->getUsername();
Run Code Online (Sandbox Code Playgroud)

应该是恩!

$ usr是您的用户对象!您无需再次查询.

security.ymlSf2文档中找出设置提供程序的方法,然后重试.

好运!


编辑:从symfony 2.6,security.context服务被弃用,使用security.token_storage服务为:

$this->get('security.token_storage')->getToken()->getUser()
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,$ this-> getUser()也可以获取用户对象. (53认同)
  • 从Symfony 2.6开始,security.context服务已被弃用并拆分为两个新服务:security.authorization_checker和security.token_storage.您可以在此处查看获取当前用户的正确方法:http://symfony.com/blog/new-in-symfony-2-6-security-component-improvements (5认同)

Ant*_*bit 62

最佳实践

根据Symfony 2.1以来的文档,只需使用此快捷方式:

$user = $this->getUser();
Run Code Online (Sandbox Code Playgroud)

以上仍然在Symfony 3.2上工作,并且是这个的捷径:

$user = $this->get('security.token_storage')->getToken()->getUser();
Run Code Online (Sandbox Code Playgroud)

security.token_storage服务是在Symfony 2.6中引入的.在Symfony 2.6之前,您必须使用getToken()security.context服务的方法.

示例:如果您想直接使用用户名:

$username = $this->getUser()->getUsername();
Run Code Online (Sandbox Code Playgroud)

如果用户类类型错误

用户将是一个对象,该对象的类将取决于您的用户提供者.


Sas*_*vic 7

在 Symfony 版本 >= 5 和 PHP >= 8.0 中,您可以使用属性键入提示经过身份验证的用户,但只能在控制器中:

public function indexAction(#[CurrentUser] User $user): Response
{
     // do something
}
Run Code Online (Sandbox Code Playgroud)


小智 6

线程有点旧,但我认为这可能会节省一些人的时间......

我遇到了与原始问题相同的问题,该类型显示为Symfony\Component\Security\Core\User\User

最终证明我是使用内存用户登录的

我的security.yml看起来像这样

security:
    providers:
        chain_provider:
            chain:
                providers: [in_memory, fos_userbundle]
        fos_userbundle:
            id: fos_user.user_manager
        in_memory:
            memory:
                users:
                    user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                    admin: { password: adminpass, roles: [ 'ROLE_ADMIN', 'ROLE_SONATA_ADMIN' ] }
Run Code Online (Sandbox Code Playgroud)

如果要使用自己的实体,则使用该提供程序的用户登录,in_memory用户类型始终为Symfony\Component\Security\Core\User\User.

谢谢,hj


Nik*_* U. 5

在 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.
}
Run Code Online (Sandbox Code Playgroud)

这仅推荐给不从Symfony 基本控制器扩展并且也不使用ControllerTrait 的 有经验的开发人员。否则,建议继续使用 getUser() 快捷方式。

关于它的博客文章