2011-10-06 58 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 –