심포니2:FOSUserBundle을 사용할 때 컨트롤러 내부에서 사용자 개체를 가져오는 방법은 무엇입니까?
-
11-12-2019 - |
문제
내 사용자를 인증하기 위해 FOSUserBundle을 사용하고 있습니다.
저장하기 전에 이 여행에 사용자 개체를 추가해야 하는 여행을 등록하기 위해 컨트롤러 내부의 사용자 개체를 가져오려고 합니다.
Symfony 문서에서 찾은 다음 방법 때문에 그렇게 하는 방법을 찾지 못했습니다.
$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);
어떻게 하면 올바르게 할 수 있나요?
해결책
다른 팁
generacodicicetagcode 메서드에 대한 설명서는 다음을 나타냅니다.
__tostring ()을 구현하거나 기본 문자열을 구현하는 객체를 반환합니다.
및 에서
getUser
클래스를 보면 여기를 참조하십시오 (기본 사용자 클래스FosuserBundle에서 사용됨) 우리는 실제로FOS\UserBundle\Model\User
메소드를 가지고 있음을 알 수 있습니다..public function __toString() { return (string) $this->getUsername(); }
실제로
__toString
객체를 가져 오지 만 Templates에서 직접 렌더링 할 수있는User
메서드를 구현하기 때문입니다.나뭇 가지에서 다음을 사용할 수 있습니다 :
.{{ dump(user) }}
어떤 종류의 물체를 볼 수 있는지 확인하십시오.그러나 당신은 실제로 문자열이 아닌 객체를 사용하고 있습니다.
해결책 :
$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->findUserByUsername($this->container->get('security.context')
->getToken()
->getUser())
. FOSUser 1.3에서는 직접 전화를 걸 수 없습니다. $this->getUser
SecurityController에서.
전화를 하셔야 해요 $this->container->get('security.context')->getToken()->getUser();
그리고 이것은 사용자 개체에 액세스하기에 충분합니다.전화할 필요 없어 $user = $em->getRepository('SiteUtilisateurBundle:Utilisateur')->find($username);
게다가 당신의 find
메소드는 객체를 인수로 기다리지 않기 때문에 초기 $username 객체를 자동으로 암시적으로 문자열로 캐스팅합니다.
i가 동일한 문제를 해결하기 위해 사용법 섹션에서 FOS 클래스를 추가합니다. I.E :
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Model\UserInterface;
. symmony>= 3.2, 문서 주 :
컨트롤러에서 현재 사용자를 가져 오는 다른 방법은 다음과 같습니다. 유형 힌트 UserInterface (그리고 기본값 로그인 할 경우 null에서 선택 사항입니다) :
.use Symfony\Component\Security\Core\User\UserInterface\UserInterface; public function indexAction(UserInterface $user = null) { // $user is null when not logged-in or anon. }
이것은 확장되지 않는 숙련 된 개발자에게만 권장됩니다. Symmony 기본 컨트롤러 및 don ' ControllerTrait 를 사용하십시오 어느 한 쪽. 그렇지 않으면 getUser ()를 계속 사용하는 것이 좋습니다. 바로 가기.
FOSUSER ^ 1.3에서는 현재 사용자를 다음과 같이 확장하는 컨트롤러 내부에서 현재 사용자를 얻을 수 있습니다.
$user = $this->container->get('security.token_storage')->getToken()->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');
}
.