1

私はSymfony2から始めており、FOSUserBundleのFOS \ UserBundle \ Form \ Handler\RegistrationFormHandlerをオーバーライドしようとしています。

私のコードは次のとおりです。

<?php

namespace Testing\CoreBundle\Form\Handler;

use FOS\UserBundle\Model\UserInterface;
use FOS\UserBundle\Form\Handler\RegistrationFormHandler as BaseHandler;
use Testing\CoreBundle\Entity\User as UserDetails;

class RegistrationFormHandler extends BaseHandler
{

    protected function onSuccess(UserInterface $user, $confirmation)
    {
        // I need an instance of Entity Manager but I don't know where get it!
        $em = $this->container->get('doctrine')->getEntityManager();
        // or something like: $em = $this->getDoctrine()->getEntityManager

        $userDetails = new UserDetails;
        $em->persist($userDetails);

        $user->setId($userDetails->getId());

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

つまり、重要なのは、Doctrineのエンティティマネージャーのインスタンスが必要なのですが、この場合、どこでどのように取得するのかわかりません。

何か案が?

前もって感謝します!

4

1 に答える 1

2
  1. EntityManagerほとんどの場合、直接使用しないでください。代わりに、適切なマネージャー/プロバイダーサービスを使用してください。

    FOSUserBundleサービスの場合、実装UserManagerInterfaceはそのようなマネージャーです。fos_user.user_managerこれは、サービスコンテナ(の同盟国)のキーを介してアクセスできますfos_user.user_manager.default。もちろん、登録フォームハンドラーはそのサービスを使用します。プロパティからアクセスできuserManagerます。

  2. ドメインモデル(特にDoctrineのエンティティ)をデータベースモデルの正確な表現であるかのように扱うべきではありません。つまり、オブジェクトを他のオブジェクト(IDではなく)に割り当てる必要があります。

    Doctrineは、エンティティ内のネストされたオブジェクトを処理できます(オブジェクトには直接の関係があります)UserDetailsUser最終的には、エンティティのカスケードオプションを構成する必要があります。User

  3. 最後に、UserDetailsそれぞれの必須の依存関係のようUserです。したがってUserManagerInterface::createUser()、フォームハンドラーではなく、オーバーライドする必要があります。とにかく、そこでユーザーの詳細を処理することはありません。

    1. UserManagerInterface独自の実装を作成します。

      class MyUserManager extends \FOS\UserBundle\Entity\UserManager {
          /**
           * {@inheritdoc}
           */
          public function createUser() {
              $user = parent::createUser();
      
              $user->setUserDetails(new UserDetails());
              // some optional code required for a proper
              // initialization of User/UserDetails object
              // that might require access to other objects
              // not available inside the entity
      
              return $user;
          }
      }
      
    2. 自分のマネージャーをDIC内のサービスとして登録します。

      <service id="my_project.user_manager" class="\MyProject\UserManager" parent="fos_user.user_manager.default" />
      
    3. 独自の実装を使用するようにFOSUserBundleを構成します。

       # /app/config/config.yml
       fos_user:
           ...
           service:
               user_manager: my_project.user_manager
      
于 2012-09-25T02:26:23.950 に答える