Php 将实体管理器传递给服务层ZF Doctrine2

Php 将实体管理器传递给服务层ZF Doctrine2,php,zend-framework,doctrine-orm,Php,Zend Framework,Doctrine Orm,我试图将实体管理器传递给服务,但尚未找到正确的方法。我想从控制器中完全移除em,这就是为什么我在寻找另一种方法 我在考虑这个选项: 1.我可以将它保存在注册表中,然后尝试从服务对象访问它。我可以从那里访问注册表吗? 2.将em注入引导中服务的基类的静态变量 你做这件事的正确方法是什么 谢谢我认为通常最好的方法是将entitymanager作为参数传递给构造函数 这允许您轻松地替换entitymanager,例如在进行单元测试时,并且与1和2的方法不同,它不依赖于基类或全局数据中的行为(注册表非常

我试图将实体管理器传递给服务,但尚未找到正确的方法。我想从控制器中完全移除em,这就是为什么我在寻找另一种方法

我在考虑这个选项: 1.我可以将它保存在注册表中,然后尝试从服务对象访问它。我可以从那里访问注册表吗? 2.将em注入引导中服务的基类的静态变量

你做这件事的正确方法是什么


谢谢

我认为通常最好的方法是将entitymanager作为参数传递给构造函数

这允许您轻松地替换entitymanager,例如在进行单元测试时,并且与1和2的方法不同,它不依赖于基类或全局数据中的行为(注册表非常类似于全局变量)

为了避免触碰控制器中的EM,可以使用依赖项注入容器,例如Symfony2中的容器或ZF2中的容器(不确定该组件是否非常稳定)

另一种可能稍微简单一点的方法是使用一种“服务定位器”对象,您可以在控制器中使用它来获取服务的实例。您可以使用服务初始化引导中的定位器,也可以使用创建它们的工厂类初始化定位器


在任何情况下,您都可能需要控制器中至少某种类型的中间对象。就我个人而言,我并不认为简单地使用EM本身有什么问题,除非你除了不想这样做之外还有其他原因。

IMO,让你的控制器知道EM没有什么错。我通常使用Zend_应用程序资源来引导原则。该资源促进了名为“条令”的引导资源,该资源具有可用的EM。抽象控制器实现和em()方法,该方法返回em

在实例化服务类时,构造函数只需在构造函数时通过调用$this->EM()注入EM

这很好,因为很多时候,简单的控制器操作不需要任何特殊的服务类,但可以通过执行
$entity=$This->em()->getRepository('Some\entity')->find(1)来实现在这些情况下,我不认为有任何理由通过服务类进行额外的重定向