2011-11-05 70 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

相关问题