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

时间:2011-09-05 18:31:47

标签: php zend-framework doctrine-orm

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

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

你做的正确方法是什么?

感谢

2 个答案:

答案 0 :(得分:2)

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

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

你可以做些什么来避免触摸控制器中的EM是使用依赖注入容器,例如Symfony2中的容器或ZF2中的容器(不确定该组件是否非常稳定)。

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

在任何情况下,您可能都需要控制器中至少某种中间对象。就个人而言,我并没有真正看到只使用EM本身的问题,除非你有其他原因除了不想这样做。

答案 1 :(得分:1)

IMO让你的控制器知道EM是没有错的。我通常使用Zend_Application_Resource来引导Doctrine。该资源有助于称为“doctrine”的引导资源,其具有可用的EM。抽象控制器实现和em()方法,它返回EM。

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

这很好,因为很多时候,简单的控制器操作不需要任何特殊的服务类,但可以放弃执行$entity = $this->em()->getRepository('Some\Entity')->find(1);在这些情况下,我没有看到任何其他重定向的原因服务类。