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);
どうすればこれを正しく行うことができますか?
getUser
メソッドのドキュメントは次のことを示しています。
__toString()を実装するオブジェクトを返すか、プリミティブ文字列が返されます。
そして、FOS\UserBundle\Model\User
class over here (FOSUserBundleで使用される基本ユーザークラス)実際に__toString
方法:
public function __toString()
{
return (string) $this->getUsername();
}
あなたは実際にUser
オブジェクトを取得すると思いますが、それは__toString
メソッドは、テンプレートで直接レンダリングできます。
Twigで使用できます:
{{ dump(user) }}
どんな種類のオブジェクトがあるかを見るため。しかし、実際には文字列ではなくオブジェクトを使用しています。
溶液:
$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->findUserByUsername($this->container->get('security.context')
->getToken()
->getUser())
FOSUser 1.3では、SecurityControllerで_$this->getUser
_を直接呼び出すことはできません。
$this->container->get('security.context')->getToken()->getUser();
を呼び出す必要があります
そして、これはユーザーオブジェクトにアクセスするのに十分です。 $user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);
を呼び出す必要はありません
さらに、find
メソッドは、引数としてオブジェクトを待機しないため、初期$ usernameオブジェクトを自動的に暗黙的にstringにキャストします。
私は同じ問題を抱えていましたが、それを解決するには、使用セクションにFOSクラスを追加します:
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Model\UserInterface;
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()ショートカットを使用し続けることをお勧めします。
ブログ投稿はこちら それについて
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');
}
FOSUser ^ 1.3の場合、次のようにBaseControllerを拡張するコントローラー内から現在のユーザーを取得できます。
$user = $this->container->get('security.token_storage')->getToken()->getUser();