在Symfony2中,如何将Doctrine的实体管理器添加到自定义类或服务中?
我试过$em = $this->get("doctrine.orm.entity_manager");
和$em = $this->getDoctrine()->getEntityManager();
两者都失败了,这导致我尝试使用我的自定义类/服务扩展Controller类,并且在一个巨大的火球中死亡。
答案 0 :(得分:8)
您不必须将控制器定义为服务才能访问EntityManager。上面提到的Controller::getDoctrine()
方法只是在检查了doctrine服务实际可用后调用$this->container->get('doctrine')
后才返回Doctrine注册表。
只需使您的自定义类/控制器扩展ContainerAware
并定义一个快捷方法,如:
public function getEntityManager() {
return $this->container->get('doctrine')->getEntityManager();
}
请注意,在扩展/实施$this->container->get(..)
的类中,它是$this->get(..)
而不是ContainerAware
。
答案 1 :(得分:7)
您需要将实体管理器服务注入自定义服务。您的服务定义应如下所示:
my.service.name:
class: my\class
arguments: [ @doctrine.orm.default_entity_manager ]
确保您的服务的__construct
方法将实体管理器作为参数。
有关详细信息,请参阅Service Container chapter。
顺便说一句,$this->getDoctrine()
是一种快捷方法,只适用于扩展Symfony\Bundle\FrameworkBundle\Controller\Controller