2011-11-05 47 views
5

在Symfony2中,我怎樣才能將Doctrine的實體管理器添加到自定義類或服務中?如何將實體管理器添加到自定義類或服務?

我試圖$em = $this->get("doctrine.orm.entity_manager");$em = $this->getDoctrine()->getEntityManager();

兩人都沒有成功,這使我試着和我的自定義類/服務擴展Controller類,以及火災的巨型球是死了。

回答

7

您需要將實體管理器服務注入到自定義服務中。你的服務定義應該是這樣的:

my.service.name: 
    class:  my\class 
    arguments: [ @doctrine.orm.default_entity_manager ] 

確保您的服務__construct方法將實體管理器作爲參數。

有關更多信息,請參閱Service Container chapter

BTW,$this->getDoctrine()是一種快捷的方法,將只在擴展Symfony\Bundle\FrameworkBundle\Controller\Controller

+0

在Symfony 2.3中我使用「@ doctrine.orm.entity_manager」。 「@ doctrine.orm.entity_manager」和「@ doctrine.orm.default_entity_manager」之間有區別嗎? –

8

一類的工作,你做必須按順序訪問的EntityManager來定義你的控制器作爲一個服務。上面提到的Controller::getDoctrine()方法在檢查了原則服務實際可用之後,通過調用$this->container->get('doctrine')來簡單地返回Doctrine註冊表。

只要讓你的自定義類/控制器擴展ContainerAware,並定義一個快捷的方法,如:

public function getEntityManager() { 
    return $this->container->get('doctrine')->getEntityManager(); 
} 

請注意,這是$this->container->get(..),而不是$this->get(..)一類擴展/實現ContainerAware

+0

擴展'ContainerAware'的奇妙點,謝謝! – Nick

+0

像魅力一樣工作!謝謝隊友:) – Marc

+0

當使用上述方法時,我得到了「調用成員函數get()在...中的非對象」。 – someuser

相關問題