2012-09-29 29 views
33

我正在使用FOSUserBundle來驗證我的用戶。Symfony2:如何在使用FOSUserBundle時獲取控制器內的用戶對象?

我試圖讓控制器內的用戶對象註冊一個旅行,我應該在保存之前將用戶對象添加到此Trip中。

我沒有找到如何做到這一點,因爲下一個方法,我發現它在symfony的DOC:

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

呈現的用戶名字符串,但我需要整個對象。

目前,我使用這種方法,但它不能正常工作。

$username = $this->container->get('security.context')->getToken()->getUser(); 
$em = $this->container->get('doctrine')->getEntityManager(); 
$user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username); 

我該如何正確地做到這一點?

回答

66

我認爲Ramon是正確的。你已經有了用戶對象。

此外,在Symfony的>的2.1.x可以使用

$this->getUser(); 

控制器內。

14

getUser方法文檔指示:

或者返回它實現__toString()對象,或返回一個原語字符串。

如果我們在FOS\UserBundle\Model\User類超過here(由FOSUserBundle使用的基本用戶類)看,我們可以看到,它確實有一個__toString方法:

public function __toString() 
{ 
    return (string) $this->getUsername(); 
} 

我想你實際上獲取User對象,但因爲它實現了__toString方法,所以它可以直接在模板中呈現。

在枝杈你可以使用:

{{ dump(user) }} 

要看看你有什麼樣的對象。但是你實際上使用的是一個對象,而不是一個字符串。

8

解決方案:

$userManager = $this->container->get('fos_user.user_manager'); 
$user = $userManager->findUserByUsername($this->container->get('security.context') 
        ->getToken() 
        ->getUser()) 
+5

顯然它完全一樣的一個內置方法的getUser() – Sejanus

1

我有同樣的問題,解決它在你使用一節即添加FOS類:

use FOS\UserBundle\FOSUserEvents; 
use FOS\UserBundle\Event\GetResponseUserEvent; 
use FOS\UserBundle\Model\UserInterface; 
3

在FOSUser 1.3你不能直接打電話進來$this->getUser SecurityController。

你必須調用$this->container->get('security.context')->getToken()->getUser();

而這足以訪問用戶對象。 不需要調用$user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);

而且你find方法自動地,隱投下您的初始$的用戶名對象字符串,因爲它不會等待一個對象作爲參數。

0

對於FOSU​​ser^1.3,你可以從延伸到BaseController這樣的控制器中獲取當前用戶:

$user = $this->container->get('security.token_storage')->getToken()->getUser(); 
相關問題