2

我刚刚更新到最新版本的 FOSUserBundle,它取消了 FormHandlers。

我的应用程序中的每个用户都有一个“主页”,当用户创建他们的帐户时,我正在使用注册表单来捕获有关主页的信息。

最初我使用 onSuccess 方法重写了 FormHandler 以保存额外的数据:

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

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

这成功地保存了 Home 文档及其在 User 文档中的引用。

使用您现在必须使用的事件侦听器方法,我订阅了一个侦听器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);
}

这会保存 Home,但不会保存 User 中的引用。当我使用该REGISTRATION_COMPLETED事件时,用户已经被 RegistrationController 保存,而在 Home 之前首先保存,所以这可能与它有关吗?

但是,我认为在创建主页后重新保存用户就足够了?

如果我var_dump($home)在刷新之后,那么它的 id 属性值是正确的。

如果我$user->setHome($home)在刷新后调用,用户中的引用仍然是 NULL。

自更新以来我没有改变我的基础模型,它仍然使用相同的 Doctrine Mongo ODM 类,所以引用应该仍然保存?

4

1 回答 1

0

FormHandler 方式和 EventListener 方式之间的唯一区别REGISTRATION_COMPLETED似乎是前者,直到创建 Home 之后才保存 User。

因此,我已将侦听器订阅更改为在FOSUserEvents::REGISTRATION_SUCCESS保存用户之前触发的事件:

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

这成功地将 Home 引用保存在 User 中,尽管它确实让我有点担心,一旦保存 User,我似乎无法更新 Home 引用?

于 2013-01-03T16:44:34.410 回答