2012-09-25 39 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

非常感謝所有的信息,這是一個完整的答案!明天我會處理這些提示,我會給你我的反饋。 –

相關問題