2012-09-25 40 views
1

我从Symfony2开始,我试图重写FOSUserBundle的FOS \ UserBundle \ Form \ Handler \ RegistrationFormHandler。FOSUserBundle:获取EntityManager实例覆盖表单处理程序

我的代码是:

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

所以,问题是,我需要主义的实体管理器的实例,但我不知道在哪里/如何在这种情况下得到它!

有什么想法?

在此先感谢!

回答

2
  1. 你不应该使用EntityManager直接在大多数情况下。改用适当的经理/提供者服务。

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

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

    学说能够处理您的实体中的嵌套对象(UserDetailsUser对象有直接关系)。最终,您需要configure cascade optionsUser实体。

  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一个serive:

      <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 
      
+0

非常感谢所有的信息,这是一个完整的答案!明天我会处理这些提示,我会给你我的反馈。 –

相关问题