Zend framework2 是否将ZF2控制器插件用于DDD中的应用程序服务?

Zend framework2 是否将ZF2控制器插件用于DDD中的应用程序服务?,zend-framework2,domain-driven-design,zend-controller-plugin,Zend Framework2,Domain Driven Design,Zend Controller Plugin,我目前正在为一个新的Zend Framework 2项目使用DDD(域驱动设计)。一切正常,但我确实有一个关于应用程序服务的问题 我知道应用程序服务位于应用程序层,是域逻辑的入口点。例如,他们可以访问域服务或存储库 我现在想知道将应用程序服务作为控制器插件实现是否有意义。在经典的MVC应用程序中,此控制器插件可以处理来自被调用的域服务或存储库的结果。根据这些结果,他们可以生成重定向响应或将数据/表单传递给ViewModel。如果此逻辑封装在插件中,我的控制器只需调用插件并返回插件结果 我完全错了

我目前正在为一个新的Zend Framework 2项目使用DDD(域驱动设计)。一切正常,但我确实有一个关于应用程序服务的问题

我知道应用程序服务位于应用程序层,是域逻辑的入口点。例如,他们可以访问域服务或存储库

我现在想知道将应用程序服务作为控制器插件实现是否有意义。在经典的MVC应用程序中,此控制器插件可以处理来自被调用的域服务或存储库的结果。根据这些结果,他们可以生成重定向响应或将数据/表单传递给ViewModel。如果此逻辑封装在插件中,我的控制器只需调用插件并返回插件结果

我完全错了吗?或者,您更愿意保留如何在控制器中对域服务或存储库的结果作出反应的逻辑

致以最良好的祝愿


拉尔夫

当然,这有点主观,人们对这类事情有强烈的看法。。。这是我的:

  • 控制器插件包含对任何MVC/REST通用的代码 操作和业务逻辑不是通用的。插件应该是为了方便 “控制”请求/响应,而不是 在模型层。将它链接到那里会使它变得更少 可重复使用,例如用于控制台操作。这也会降低可能性 将业务逻辑与其他框架一起使用
  • 这很难测试。注入控制器插件作为控制器 类构造函数参数有点多余,因为它们已经存在 可从插入
    AbstractActionController
    AbstractRestfulController
    的插件管理器获得。没有以明显/可见的方式注入依赖项(如通过constructor方法)使得很难弄清楚控制器类实际上依赖什么 在…上另外,由于所有插件(
    AbstractPlugin
    related)都依赖于控制器实例,因此从 http到控制台(如phpunit测试)可能会出现问题。还有测试逻辑 编写/提供控制器插件迟早会 升级至将请求/响应对象包括在测试和 这是不必要的复杂性
  • 这不是直觉。当我听到插件时,我想到一些小东西。 没有一个完整的业务逻辑代码埋在这样不显眼的地方 名称所以当我没有时间调试别人的代码时 我需要它把事情弄得不对劲

  • 我想再次重申,这只是我的观点。我已经了解到,在一个足够怪异的用例下,很多模式都可能崩溃,但到目前为止,以上几点对我和我的团队来说是有意义的。

    作为我的解决方案的一个示例,您可以看到控制器动作:

    公共函数showAction()
    {
    $service=$this->readProductEntityCommand;
    $service->setId($this->params()->fromRoute('id');
    试一试{
    $result=$service->execute();
    }捕获(ProductException$e){
    $this->flashMessenger()->addMessage($e->getMessage());
    返回$this->redirect()->toRoute('part3/product');
    }
    返回新的ViewModel(
    排列(
    'productEntity'=>$result->getData(),
    )
    );
    
    }
    我不确定域服务和应用程序服务之间的实际区别。我想你可以为你的服务类制作插件,但我目前还没有看到它的优势。我有控制器工厂,并注入控制器所需的服务。有时,我的服务本质上就像存储库一样,但我仍然总是定义一个服务,因为应用程序定义了一个基本服务,它处理所有域安全性。域服务只处理属于域的内容,而应用程序服务作为应用程序和域之间的网关。这些应用程序服务注入了存储库或域服务,控制器注入了应用程序服务。我将应用程序服务创建为单独的命令对象。这些命令在出现错误时抛出异常,或在成功时返回一个小的结果对象。控制器操作现在只处理这些异常或结果对象。谢谢你的想法。