2

FormHandlers를 사용하지 않는 FOSUserBundle의 최신 버전으로 방금 업데이트했습니다.FOSUserBundle : 이벤트 리스너를 사용하여 관련 등록 데이터 저장

내 앱의 각 사용자는 '집'을 가지고 있으며 사용자가 자신의 계정을 만들 때 등록 양식을 사용하여 집에 대한 정보를 캡처하고 있습니다.

원래 내가는 onSuccess 방법을 사용하여 추가 데이터를 저장하기 위해 FormHandler을 무시했다 :

public function onSuccess(UserInterface $user, $confirmation) 
{ 
    $home = $user->getHome(); 
    $this->documentManager->persist($home); 
    $this->documentManager->flush(); 

    parent::onSuccess($user, $confirmation); 
} 

이 성공적으로 홈 문서와 사용자 문서에 대한 참조를 저장. 지금 사용해야하는 이벤트 리스너 방식으로

, 나는 FOSUserEvents::REGISTRATION_COMPLETED에 리스너를 등록하고 다음과 같은 방법 만든이 홈을 저장

public function onRegistrationCompleted(FilterUserResponseEvent $event) 
{ 
    $user = $event->getUser(); 
    $home = $user->getHome(); 

    $this->documentManager->persist($home); 
    $this->documentManager->flush(); 

    $this->userManager->updateUser($user); 
} 

,하지만에 대한 참조를 저장하지 않습니다 사용자. REGISTRATION_COMPLETED 이벤트를 사용할 때, 사용자는 RegistrationController에 의해 이미 저장되었지만 홈이 먼저 저장되기 전에 그와 관련이있을 수 있습니다.

그러나 가정을 만든 후에 사용자를 다시 저장한다고 가정했는데 충분합니까?

플러시 후 I var_dump($home) 인 경우 id 속성에 올바른 값을 갖습니다.

플러시 후 $user->setHome($home)을 호출하면 User의 참조가 여전히 NULL입니다.

업데이트 이후 내 기본 모델을 변경하지 않았지만 여전히 동일한 Doctrine Mongo ODM 클래스를 사용하므로 참조가 저장되어야합니다.

답변

0

FormHandler 방식과 REGISTRATION_COMPLETED EventListener 방식의 유일한 차이점은 이전에는 홈이 생성 될 때까지 사용자가 저장되지 않았다는 것입니다.

그래서, 사용자가 저장하기 전에 터집니다 FOSUserEvents::REGISTRATION_SUCCESS 이벤트에 내 리스너 구독을 변경했습니다 : 그것은 나를 조금 걱정 할 않지만,

public function onRegistrationSuccess(FormEvent $event) 
{ 
    $user = $event->getForm()->getData(); 
    $home = $user->getHome(); 
    $this->documentManager->persist($home); 
    $this->documentManager->flush(); 
} 

이 성공적으로 사용자의 홈 참조를 저장하는 사용자가 저장되면 홈 참조를 업데이트 할 수 없습니다.