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(); 
} 

这成功保存用户的主参考,但它确实让我担心了一下说一旦用户被保存,我似乎无法更新家庭参考?