2011-10-06 49 views
105

我正在使用Symfony安全设置。一切工作正常,但我不知道该怎么办一件重要的事情:如何获取表示Symfony2中当前用户的实体?

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

Welcome, {{ app.user.username }} 

或类似

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

我真的希望它会是

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

,但不起作用。它给了我一个类类型

Symfony\Component\Security\Core\User\User 

的,我想类型

Acme\AuctionBundle\Entity\User 

这是我的实体之一....

+13

[symfony的书:检索用户对象(http://symfony.com/doc/master/book/security.html#retrieving-the-user-object) – Hubro

回答

167

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

然后用

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

应该enougth!

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

找到从Sf2 Documentation开始在security.yml中设置提供商的方法,然后重试。

祝你好运!


编辑:从symfony的2。6,security.context服务已过时,使用security.token_storage服务为:

$this->get('security.token_storage')->getToken()->getUser() 
+45

对我来说,$ this-> getUser()也可以获取用户对象。 – madc

+0

@madc好的发现 – ChocoDeveloper

+0

如果我需要PHP模板上的用户实体呢? – DomingoSL

-34

哦,首先你需要申请的用户名用户在你的控制器动作像这样从会话:

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

然后做一个查询的分贝,让你的对象机智^ h像

$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(); 

的$用户经常DQL现在应该使用该用户名保存用户(您也可以使用,当然等领域)

...但你必须先配置/应用/ config/security.yml配置为您的安全提供商使用相应的字段,如下所示:

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

希望这有助于您!

+0

那么马丁无论你想要的用户或用户名。这是你的选择。这是你的责任,以获得你需要的对象。正如你所说的,你不需要普通用户,而是Acme命名空间用户。 – ktolis

+5

“SELECT u FROM Acme \ AuctionBundle \ Entity \ User u where u.username =”。$ username; =你应该使用参数化查询! – CappY

+0

'$ this-> get('security.context') - > getToken() - > getUser()'本身可以获取登录的用户对象。您不必再次查询。事实上,你使用的是哪个版本? – Jeet

6

线程是有点老,但我想,这也许可以救一个人的时间......

我遇到同样的问题,因为原来的问题,该类型表现为 的Symfony \分量\安全\核心\用户\用户

它最终证明,我是在内存中的用户使用记录

我security.yml看小号omething这样

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 \分量\安全\核心\用户\用户。

感谢, HJ

49

最佳实践

根据the documentation因为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(); 

如果错误的用户类类型

用户将一个对象和对象的类将取决于你user provider

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

欢迎使用stackoverflow。请解释一下答案。 stackoverflow.com/help/how-to-answer –