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
これは私のエンティティです...
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
}
ドキュメント によると、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();
ユーザーはオブジェクトになり、そのオブジェクトのクラスは ユーザープロバイダー に依存します。
スレッドは少し古いですが、これはおそらく誰かの時間を節約できると思います...
元の質問と同じ問題に遭遇しました。タイプは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
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()ショートカットを使用し続けることをお勧めします。
ブログ投稿 それについて
$this->container->get('security.token_storage')->getToken()->getUser();