web-dev-qa-db-ja.com

Symfony2で現在のユーザーを表すエンティティを取得するにはどうすればよいですか?

Symfonyセキュリティセットアップを使用しています。すべて正常に動作しますが、1つの重要なことを行う方法がわかりません。

小枝では、以下を行うことで現在のユーザーの情報にアクセスできます。

Welcome, {{ app.user.username }}

または類似

コントローラーでこの同じ情報にアクセスするにはどうすればよいですか?具体的には、現在のユーザーエンティティを取得して、別のエンティティにリレーショナルに格納できるようにします(1対1マッピング)。

私は本当にそうなることを望んでいた

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

しかし、それは機能しません。それは私にタイプのクラスを与えます

Symfony\Component\Security\Core\User\User

そして、私はタイプの1つが欲しい

Acme\AuctionBundle\Entity\User

これは私のエンティティです...

121
Robert Martin

Ktolisが言うように、最初に/app/config/security.ymlを設定する必要があります。

次に

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

素晴らしいはずです!

$ usrはユーザーオブジェクトです!再度クエリを実行する必要はありません。

Sf2 Documentation からsecurity.ymlでプロバイダーを設定する方法を見つけて、もう一度やり直してください。

幸運!


EDIT: symfony 2.6から、security.contextサービスは非推奨です。security.token_storageサービスを次のように使用します:

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

SF4の編集:

Symfony 4(おそらく3.3ですが、4で実際にテストされています)では、このようなコントローラーでauto-wiringを介してSecurityサービスを注入できます:

use Symfony\Component\Security\Core\Security;

public function privatePage( Security $security ) : Response
{
    $user = $security->getUser();
    // ... do whatever you want with $user
}
189
Cristian Douce

ベストプラクティス

ドキュメント によると、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()メソッドを使用する必要がありました。

Example:そして、もしあなたが直接ユーザー名が欲しいなら:

$username = $this->getUser()->getUsername();

間違ったユーザークラスタイプの場合

ユーザーはオブジェクトになり、そのオブジェクトのクラスは ユーザープロバイダー に依存します。

60
Antoine Subit

スレッドは少し古いですが、これはおそらく誰かの時間を節約できると思います...

元の質問と同じ問題に遭遇しました。タイプはSymfony\Component\Security\Core\User\Userとして表示されます

最終的には、メモリ内のユーザーを使用してログインしたことが判明しました

私のsecurity.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' ] }

独自のエンティティを使用する場合、in_memoryユーザータイプは常にSymfony\Component\Security\Core\User\Userです。そのプロバイダーのユーザーを使用してログインします。

ありがとう、hj

6
hj'

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()ショートカットを使用し続けることをお勧めします。

ブログ投稿 それについて

3
Nikita U.
$this->container->get('security.token_storage')->getToken()->getUser();
2
Alenko Verzina