FOSUserBundle:获取重写Form Handler的EntityManager实例

时间:2012-09-25 00:16:31

标签: symfony doctrine fosuserbundle

我从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实体管理器的实例,但我不知道在这种情况下它在何处/如何获得它!

有什么想法吗?

提前致谢!

1 个答案:

答案 0 :(得分:2)

  1. 在大多数情况下,您不应直接使用EntityManager。请改用适当的经理/提供商服务。

    如果是FOSUserBundle服务,实施UserManagerInterface就是这样的经理。它可以通过服务容器中的fos_user.user_manager键访问(它是fos_user.user_manager.default的联盟)。当然是注册表单处理程序uses that service,可以通过userManager属性访问它。

  2. 您不应该将您的域模型(例如,Doctrine的实体)视为数据库模型的精确表示。这意味着,您应该将对象分配给其他对象(而不是它们的ID)。

    Doctrine能够处理实体中的嵌套对象(UserDetailsUser对象具有直接关系)。最终,User实体必须configure cascade options

  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