2

FormHandlers を廃止する最新バージョンの 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によって保存されているので、何か関係があるのでしょうか?

ただし、ホームが作成された後にユーザーを再保存するだけで十分だと思いましたか?

var_dump($home)フラッシュ後にIを実行すると、id プロパティの正しい値が得られます。

フラッシュ後に呼び出すと$user->setHome($home)、User の参照は NULL のままです。

更新以降、基礎となるモデルを変更していません。同じ Doctrine Mongo ODM クラスを使用しているため、参照は保存されますか?

4

1 に答える 1

0

FormHandler の方法と EventListener の方法の唯一の違いはREGISTRATION_COMPLETED、前者ではホームが作成されるまでユーザーが保存されないことです。

したがって、リスナーのサブスクリプションをFOSUserEvents::REGISTRATION_SUCCESS、ユーザーが保存される前に発生するイベントに変更しました。

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

これにより、ホーム参照がユーザーに正常に保存されますが、ユーザーが保存されるとホーム参照を更新できないように見えるのではないかと少し心配になりますか?

于 2013-01-03T16:44:34.410 に答える