web-dev-qa-db-ja.com

Symfony2:FOSUserBundleを使用するときにコントローラー内でユーザーオブジェクトを取得する方法

FOSUserBundleを使用してユーザーを認証しています。

Controller内のユーザーオブジェクトを取得して旅行を登録しようとしていますが、保存する前にこの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);

どうすればこれを正しく行うことができますか?

36
skonsoft

Ramon が正しいと思います。すでにユーザーオブジェクトがあります。

Symfony> 2.1.xでも使用できます

$this->getUser();

コントローラー内部。

71
Mohammad Niknam

getUserメソッドのドキュメントは次のことを示しています。

__toString()を実装するオブジェクトを返すか、プリミティブ文字列が返されます。

そして、FOS\UserBundle\Model\User class over here (FOSUserBundleで使用される基本ユーザークラス)実際に__toString 方法:

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

あなたは実際にUserオブジェクトを取得すると思いますが、それは__toStringメソッドは、テンプレートで直接レンダリングできます。

Twigで使用できます:

{{ dump(user) }}

どんな種類のオブジェクトがあるかを見るため。しかし、実際には文字列ではなくオブジェクトを使用しています。

15
Ramon Kleiss

溶液:

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

FOSUser 1.3では、SecurityControllerで_$this->getUser_を直接呼び出すことはできません。

$this->container->get('security.context')->getToken()->getUser();を呼び出す必要があります

そして、これはユーザーオブジェクトにアクセスするのに十分です。 $user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);を呼び出す必要はありません

さらに、findメソッドは、引数としてオブジェクトを待機しないため、初期$ usernameオブジェクトを自動的に暗黙的にstringにキャストします。

3
Tsounabe

私は同じ問題を抱えていましたが、それを解決するには、使用セクションにFOSクラスを追加します:

use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Model\UserInterface;
2
user1829870

Symfony> = 3.2では、 ドキュメント は次のように述べています:

コントローラーの現在のユーザーを取得する別の方法は、コントローラー引数を serInterface でタイプヒントすることです(ログインがオプションの場合はデフォルトでnullになります)。

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

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

これは、 Symfonyベースコントローラー から拡張せず、 ControllerTrait も使用しない経験豊富な開発者にのみお勧めします。それ以外の場合は、getUser()ショートカットを使用し続けることをお勧めします。

ブログ投稿はこちら それについて

2
Nikita U.
public function indexAction()
{
    /* @var $user \FOS\UserBundle\Model\UserInterface */
    if ($user = $this->getUser())
    {
        echo '<pre>';
        print_r($user);
        print_r($user->getRoles()); // method usage example

        exit;

        return $this->redirectToRoute('dashboard');
    }

    return $this->redirectToRoute('login');
}
0
tfont

FOSUser ^ 1.3の場合、次のようにBaseControllerを拡張するコントローラー内から現在のユーザーを取得できます。

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