Zend Framework/Doctrine 2 应用程序。:
/app
/modules
/blog
/controllers
/BlogController.php
/domain
/entities
/services
/PostService.php
/repositories
PostService 负责基本的 CRUD 操作,直接处理实体和 EntityManager 以从我的 Controller 中抽象出业务和持久性逻辑。
如果可能,我希望将我的服务保留为 POPO。在我的服务类中访问/注入(inject) EntityManager 的最佳方式是什么?我是 DI 的新手,因此提出了这个问题。 EntityManager 可作为我的 Controller 中的引导资源进行访问。
我应该只为服务编写一个抽象类来访问 EntityManager 吗? 我应该编写一个类来实例化我的服务,通过构造函数/setter 注入(inject) EntityManager 吗?...这将涉及我的服务的接口(interface)。我应该使用 DI 框架吗?如果有,是哪一个以及如何?
或者还有其他更好的方法吗?
我已经阅读了有关依赖注入(inject)的内容,但在这种情况下仍然没有完全掌握它。
更新(2011 年 1 月 12 日)
所以这是我当前的工作解决方案:我有一个名为 Resource 的操作助手,它是一个用于从 Bootstrap 检索资源的助手,或者您可以手动向其添加资源:http://pastie.org/1450851
$this->_helper->Resource('em'); // get EntityManager
有人可以深入了解在帮助程序类中本地存储 Bootstrap 资源对性能的影响吗?我做得过头了吗?
TODO:从类中重构 resourcesMap。
我有一个用于加载服务的操作助手:http://pastie.org/1450855
TODO:在尝试加载服务之前添加检查。
请对以上提出一些批评:)
最佳答案
为了将我的服务层与应用程序的其余部分分开,我通常会依靠我的 Controller 来处理注入(inject)。我还没有分解并使用 DI 容器,但是资源注入(inject)器描述了 here非常适合在我的应用程序周围传递 EntityManager。
EntityManager 作为资源在 Bootstrap 上实例化,如果 Controller 需要,ActionHelper 会将其添加到 Controller 。然后我将使用构造函数注入(inject)或 setter 注入(inject)将它传递给服务对象。
class MyController extends Zend_Action_Controller
{
// A little different from O'Phinney's implementation. I'm adding
// the resource named 'entitymanager' as the public property $em.
public $dependencies = array(
'entitymanager' => 'em'
);
public function myAction()
{
$service = new MyService($this->em);
// or...
$service = new MyService();
$service->setEntityManager($em);
}
}
我也确实使用了一个名为 IHasEntityManager
的接口(interface)。
如果您不想让您的 Controller 负责构建服务对象,您可能需要查看像 Symfony Dependency Injection 这样的 DI 容器。 .
关于php - 帮助 MVC 应用程序中的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4612011/