2013-10-16 52 views
3

我創建了一些其他方法來幫助管理Symfony2項目中的實體。我希望這些方法可以在Doctrine的EntityManager上使用,它是通過「doctrine.orm.entity_manager」鍵從容器中獲得的。如何在Symfony2中覆蓋/擴展默認的Doctrine EntityManager類?

我發現this post,並試圖實現它,但它不工作。我得到一個錯誤,說The attribute "name" must be set for path "doctrine.orm.entity_managers".

這是一個較舊的帖子,所以它可能是某種「欺騙」,從那時起已被棄用;我正在使用Symfony2和Doctrine的最新穩定版本。

有沒有一種方法來覆蓋Doctrine用來創建它的默認EntityManager的類,或者我將不得不像其他服務一樣創建它並使用它呢?

+0

你會怎麼做? – Touki

+0

我剛剛添加了一些輔助方法,就像處理更大的實體組一樣。例如,我有一個方法需要多個實體,持久化它們,然後在操作結束時運行一次刷新。它們並不是很大的變化,但是當我開始構建其他東西時,這些小東西可以節省我的時間。 – jzimmerman2011

+1

爲什麼不創建另一個以EntityManager'作爲構造函數參數的類,並且會處理您需要的方法? – Touki

回答

3

方式保持不變。

使用您的自定義EntityManager類覆蓋參數doctrine.orm.entity_manager.classorm.xml您的services.yml延伸Doctrine\ORM\EntityManager

覆蓋create方法(它改變了一點點)

public static function create($conn, Configuration $config, EventManager $eventManager = null) 
{ 
    if (! $config->getMetadataDriverImpl()) { 
     throw ORMException::missingMappingDriverImpl(); 
    } 

    switch (true) { 
     case (is_array($conn)): 
      $conn = \Doctrine\DBAL\DriverManager::getConnection(
       $conn, $config, ($eventManager ?: new EventManager()) 
      ); 
      break; 

     case ($conn instanceof Connection): 
      if ($eventManager !== null && $conn->getEventManager() !== $eventManager) { 
       throw ORMException::mismatchedEventManager(); 
      } 
      break; 

     default: 
      throw new \InvalidArgumentException("Invalid argument: " . $conn); 
    } 

    // return your instance of em 
    return new MyEntityManager($conn, $config, $conn->getEventManager()); 
} 

錯誤,你看到的是,你在config.yml教義設置錯誤的事實。見reference

+1

我沒有看到任何對頁面中「doctrine.orm.entity_manager.class」配置項的引用。我注意到這個例子顯示了多個實體管理器定義,但是我沒有看到它們下面的「class」設置。 – jzimmerman2011

+0

它只是參數中的一個字符串,請參閱[orm.xml](https://github.com/doctrine/DoctrineBundle/blob/master/Resources/config/orm.xml#L9) –

+0

請參閱此鏈接:http:// forum.symfony-project.org/forum/23/topic/36727.html – Chirag