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

Entity framework 如何在Symfony2中获取表示当前用户的实体?,entity-framework,security,symfony,Entity Framework,Security,Symfony,我正在使用Symfony安全设置。一切正常,但我不知道如何做一件重要的事情: 在twig中,我可以通过以下操作获取当前用户的信息: Welcome, {{ app.user.username }} 或类似 如何访问控制器中的相同信息?具体地说,我希望获取当前用户实体,以便将其以关系方式存储在另一个实体中(一对一映射) 我真的希望是这样 $this->get('security.context')->getToken()->getUser() 但这不起作用。它给了我一个类型的

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

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

Welcome, {{ app.user.username }}
或类似

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

我真的希望是这样

$this->get('security.context')->getToken()->getUser()
但这不起作用。它给了我一个类型的类

Symfony\Component\Security\Core\User\User
我想要一个这种类型的

Acme\AuctionBundle\Entity\User

这是我的实体…

首先,您需要在控制器操作中从会话请求用户的用户名,如下所示:

$username=$this->get('security.context')->getToken()->getUser()->getUserName();
然后对数据库执行查询,并使用常规的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中进行了真正的测试),您可以通过自动布线在控制器中注入
安全性
服务,如下所示:

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

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

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

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

我的安全。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' ] }
内存中的用户类型始终为Symfony\Component\Security\Core\user\user如果要使用自己的实体,请使用该提供程序的用户登录

谢谢, hj

最佳实践 根据Symfony 2.1,只需使用以下快捷方式:

$user = $this->getUser();
以上内容仍在Symfony 3.2上使用,是实现此目的的快捷方式:

$user = $this->get('security.token_storage')->getToken()->getUser();
Symfony 2.6中引入了
security.token\u存储
服务。在Symfony 2.6之前,您必须使用
security.context
服务的
getToken()
方法

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

$username = $this->getUser()->getUsername();
如果用户类类型错误 用户将是一个对象,该对象的类别将取决于您的用户。

在symfony>=3.2中,声明:

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

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


关于它

你要么想要用户,要么想要用户名。选择权在你。得到你需要的东西是你的责任。正如您所说,您不需要常规用户,只需要Acme命名空间用户。“从Acme\AuctionBundle\Entity\user u中选择u,其中u.username=“.username=”..username;=您应该使用参数化查询
$this->get('security.context')->getToken()->getUser()
本身会获取登录的用户对象。您不必再次查询它。事实上,您使用的是哪个版本?如果我需要PHP模板上的用户实体怎么办?@DomingoSL检查官方文档中的以下链接:自Symfony 2.6以来,security.context服务已被弃用并分为两个新服务:security.authorization\u checker和security.token\u storage。您可以在这里检查获取当前用户的正确方法:我在Symfony 5.1.2和
$user=$this->security->getUser()
$user
对于我来说总是
null
,无论是否登录。哦,这似乎是因为我在事件订阅服务器中执行此操作,并且在请求的早期尚未初始化。欢迎使用stackoverflow。请解释一下答案。stackoverflow.com/help/how-to-answer这在尝试获取EventSubscriber中的当前用户时帮了我很多忙:我必须在_构造中将(Security$Security)作为参数自动连线,然后使用$Security->getUser()和瞧!
$this->container->get('security.token_storage')->getToken()->getUser();
use Symfony\Component\Security\Core\User\UserInterface\UserInterface;

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