为什么要创建服务(工厂/创建者)而不是在Controller中执行此操作?

时间:2014-06-23 16:58:42

标签: php laravel

在Laracasts教程中,我看到了:

  • app/controller/TasksController
  • app/Acme/Services/TaskCreatorService

TasksController有这种方法:

public function store()
{
    // ...
    $this->TaskCreator->make(Input::all());
    // ...
}

TaskCreatorService方法中make验证并创建任务。

这种方法是什么以及为什么Jeffrey Way会这样做?

为什么不直接在控制器中创建任务


抱歉我的英文

1 个答案:

答案 0 :(得分:2)

实际上关于Dependency injection是:

  

依赖注入是一种软件设计模式,其中包含一个或多个   依赖项(或服务)被注入或通过引用传递到   依赖对象(或客户端),并成为客户端的一部分   州。该模式分离了客户端依赖项的创建   从它自己的行为,它允许程序设计loosely coupled并遵循dependency inversionsingle responsibility principles

在这种情况下,它是SOLID原则的一部分。在SOLID中,Dependency inversion principle表示one should "Depend upon Abstractions. Do not depend upon concretions."

依赖注入的优点:

  • 因为依赖注入不需要对代码行为进行任何更改,所以它可以作为重构应用于遗留代码。结果是更加独立的客户端,使用存根或模拟对象模拟其他未测试的对象,更容易单独进行单元测试。这种易于测试通常是使用依赖注入时注意到的第一个好处。

  • 依赖注入允许客户端删除其需要使用的具体实现的所有知识。这有助于将客户端与设计更改和缺陷的影响隔离开来。它提升了可重用性,可测试性和可维护性。

  • 依赖注入可用于将系统的配置详细信息外部化为配置文件,从而允许在不重新编译的情况下重新配置系统。可以针对需要不同组件实现的不同情况编写单独的配置。这包括但不限于测试。

  • 减少应用程序对象中的样板代码,因为初始化或设置依赖项的所有工作都由提供程序组件处理。

  • 依赖注入允许并发或独立开发。两个开发人员可以独立开发彼此使用的类,而只需要知道类将通过的接口。插件通常由第三方商店开发,甚至从不与创建使用插件的产品的开发人员交谈。的 (参考文献:维基百科)。