如何在 Symfony2中获得表示当前用户的实体?

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

在细枝,我可以达到当前用户的信息,通过做:

Welcome, {{ app.user.username }}

或类似的

如何在 Controller 中访问相同的信息?具体来说,我希望获取当前用户实体,以便能够将其关系地存储在另一个实体中(一对一映射)。

我真的很希望

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

但这不管用,它给了我一个类型

Symfony\Component\Security\Core\User\User

我想要一种

Acme\AuctionBundle\Entity\User

这是我的实体。

197322 次浏览

首先,您需要像下面这样从控制器操作的会话中请求用户的用户名:

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

然后对 db 执行查询,并使用常规 dql 获取对象,如

$em = $this->get('doctrine.orm.entity_manager');
"SELECT u FROM Acme\AuctionBundle\Entity\User u where u.username=".$username;
$q=$em->createQuery($query);
$user=$q->getResult();

$user 现在应该保存具有这个用户名的用户(当然您也可以使用其他字段)

... 但是您必须首先配置您的/app/config/security.yml 配置,以便为您的安全提供程序使用适当的字段,如下所示:

security:
provider:
example:
entity: {class Acme\AuctionBundle\Entity\User, property: username}

希望这个能帮上忙!

Symfony 4 + ,2019 + 途径

在 symfony 4中(可能也是3.3,但是只在4中进行了实际测试) ,你可以像这样通过控制器中的 自动接线注入 Security服务:

<?php


use Symfony\Component\Security\Core\Security;


class SomeClass
{
/**
* @var Security
*/
private $security;


public function __construct(Security $security)
{
$this->security = $security;
}


public function privatePage() : Response
{
$user = $this->security->getUser(); // null or UserInterface, if logged in
// ... do whatever you want with $user
}
}

第二交响曲-进场

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

然后

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

应该够了!

$user是您的用户对象! 您不需要再次查询它。

Sf2文件中找到在 security.yml中设置提供程序的方法,然后再试一次。

祝你好运!

这个帖子有点旧了,但是我想这可能会节省一些人的时间..。

我遇到了与原问题相同的问题,类型显示为 Symfony 组件安全核心用户

最后发现我是用内存用户登录的

我的安全。 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' ] }

In _ memory 用户类型始终是 Symfony 组件安全核心用户(Symfony Component Security Core User User) ,如果您想使用自己的实体,请使用该提供商的用户登录。

谢谢, HJ

最佳实践

根据 文件的说法,Symfony 2.1只需使用这个快捷方式:

$user = $this->getUser();

上面是 还在写 Symfony 3.2,是这样做的一个快捷方式:

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

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

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

$username = $this->getUser()->getUsername();

如果用户类类型错误

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

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

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

获取控制器中当前用户的另一种方法是 使用 用户界面键入提示控制器参数(并默认为 如果登录是可选的,返回 null) :

use Symfony\Component\Security\Core\User\UserInterface\UserInterface;


public function indexAction(UserInterface $user = null)
{
// $user is null when not logged-in or anon.
}

这只建议有经验的开发人员不进行扩展 不要使用 控制者特质 否则,建议继续使用 getUser () 捷径。

博客文章 关于它

在 Symfony version > = 5和 PHP > = 8.0中,只有在控制器中,你可以使用属性来输入提示:

public function indexAction(#[CurrentUser] User $user): Response
{
// do something
}