2012-06-18 36 views
4

我在實體類此功能,但getDoctrine不喜歡......如何在實體內使用entityManager?

public function getObject() 
{ 
    $em = $this->getDoctrine()->getEntityManager(); 

    switch($this->objectType) 
    { 
     case 'video': 
      return $em->getRepository('fdj2012AdminBundle:Video')->find($this->objectId); 
      break; 
     case 'default': 
      return false; 
      break; 
    } 
} 

如何使用EntityManager我的實體裏面?

+3

[在Doctrine 2.0實體中使用EntityManager]的可能重複(http://stackoverflow.com/questions/4108291/using-entitymanager-inside-doctrine-2-0-entities)。您的實體不應該瞭解實體管理器,而應該在需要時將所需的任何數據/服務傳遞給您的實體。 – richsage

+0

我從樹枝模板得到這個......但是我會加深這一點。謝謝 –

+0

你需要表繼承嗎? - > http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html – toine

回答

10

其實體不應該知道EM。如果我需要實體中的高級邏輯,我使用事件偵聽器。當你註冊監聽器像服務時,你可以在那裏傳遞參數,比如EM或Container,並將它們放入Listener類中。

Symfony Doc

但我知道不是真的好方法EM實體類中。通過在實體方法中採用全局變量Kernel。

global $kernel; 
if ('AppCache' == get_class($kernel)) 
{ 
    $kernel = $kernel->getKernel(); 
} 
$em = $kernel->getContainer()->get('doctrine.orm.entity_manager'); 

可恥的是我:(

+0

您如何看待實體實現'\ Doctrine \ Common \ Persistence \ ObjectManagerAware'?當保溼'UnitOfWork'完成這項工作時。 – juanmf

-1

在services.yml添加此

access_manager: 
    class: AppBundle\Services\EntityManager 
    arguments: [ @service_container ] 

在經理 -

​​

要訪問管理器 -

 $entity2Manager = $this->_container->get('entity2_manager'); 
+0

注入容器是不好的做法。注入整個服務容器只是爲了獲得實體管理器正在打破飛行。儘管在某些情況下,這可能是一個快速且骯髒的解決方案,例如避免循環引用。 – cezar

相關問題