php - 帮助 MVC 应用程序中的依赖注入(inject)

标签 php model-view-controller zend-framework dependency-injection doctrine-orm

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/

相关文章:

php - 将 isset 与 mysql_real_escape_string 结合使用

php - 每次使用 ionic、php 和 my sql 在日历中的特定日期创建事件时,创建一个要在准确时间调用的函数

zend-framework - 通过 Gmail smtp 服务器使用 Zend_Mail 发送邮件

javascript - 如果产品缺货,则显示属性 Magento

php - 从 Wikipedia 获取信息 - 如何获取 HTML 表单?

javascript - 为什么我无法从 jQuery (PHP) 接收数据?

php - 从 SQL 表中提取照片和照片 ID,并将它们显示在 PHP 页面的列表中

python - wxPython 的 MVC 框架

javascript - 在ejs中添加incrememter到id

.net - Visual Studio 2012/13 导出模板中缺少 MVC NuGet