2

我剛剛更新到FOSUserBundle的最新版本,該版本不再使用FormHandlers。FOSUserBundle:使用事件監聽器保存相關注冊數據

我的應用程序中的每個用戶都有一個「主頁」,我使用註冊表單在用戶創建其帳戶時捕獲有關主頁的信息。

本來我已經覆蓋了FormHandler使用的onSuccess方法來保存額外的數據:

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保存了,而在首頁被保存之前,這可能與它有關係?

但是,我認爲在創建Home之後重新保存用戶就足夠了?

如果我在刷新後var_dump($home),那麼它具有正確的id屬性值。

如果在刷新後調用$user->setHome($home),則User中的引用仍爲NULL。

自更新以來,我還沒有更改過我的基礎模型,它仍然使用相同的Doctrine Mongo ODM類,所以引用仍然應該保存?

回答

0

FormHandler方式和REGISTRATION_COMPLETED EventListener方式之間唯一的區別似乎是前者中的用戶在創建Home之後才被保存。

所以,我改變了我的聽衆訂閱的FOSUserEvents::REGISTRATION_SUCCESS事件,觸發用戶保存之前:

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

這成功保存用戶的主參考,但它確實讓我擔心了一下說一旦用戶被保存,我似乎無法更新家庭參考?