概念
管道模式用于将复杂的进程分解成多个独立的子任务。每个独立的任务都是可复用的,因此这些任务可以被组合成复杂的进程。
这种模式允许你讲庞大的进程分解成更小的子任务,这些子任务将数据进行处理并将处理后的结果传递给下一个子任务。就像流水线一样,有条不紊,从原料加工到成品,实现一道完整的工序。
管道中的每一个任务都会接受并返回同一类型的数据,这样子任务可以在管道中被添加、移除或者替换,而不影响其它子任务。
Laravel 在框架中的很多地方使用了管道设计模式,最常见的就是中间件的实现
当请求最终到达控制器动作被处理前,会先经过一系列的中间件。每个中间价都有一个独立的职责,例如,设置 Cookie、判断是否登录以及阻止 CSRF 攻击等等。
每个阶段都会对请求进行处理,如果请求通过就会被传递给下一个处理,不通过就会返回相应的 HTTP 响应。
这种机制使得我们很容易在请求最终到达应用代码前添加处理操作,当然如果不需要这个处理操作你也可以随时移除而不影响请求的生命周期。
管道模式的优点
首先,将复杂的处理流程分解成独立的子任务,从而方便测试每个子任务;
其次,被分解的子任务可以被不同的处理进程复用,避免代码冗余。
最后,在复杂进程中添加、移除和替换子任务非常轻松,对已存在的进程没有任何影响。
管道模式的缺点
虽然每个子任务变得简单了,但是当你再度尝试将这些子任务组合成完整进程时有一定复杂性;
此外你还需要保证独立子任务测试通过后整体的流程能正常工作,这有一定的不确定性。
最后,当你看到的都是一个个子任务时,对理解整体流程带来困难(盲人摸象的故事想必大家很熟悉,正是此理)
如何使用Laravel的管道
|
|
举个例子,追查一下调用流程
|
|
更简单易懂的pipeline模式实现thephpleague/pipeline
参考
Laravel pipeline组件的实现
Laravel 中管道设计模式的使用
Laravel 5.1 源码阅读笔记
Laravel Pipeline 组件的实现