所谓管道(Pipeline)设计模式就是将会数据传递到一个任务序列中,管道扮演者流水线的角色,数据在这里被处理然后传递到下一个步骤。

使用管道使用很多好处的,尤其是在单个任务中编写复杂处理代码时管道为我们提供了极大的便利,而且可以在管道中轻松添加、移除或者替换阶段任务。

Laravel 在框架中的很多地方用到了 Pipeline 设计模式,这意味着所有我们需要实现管道设计模式的地方已然是应用底层的一部分了。

我们可以使用 Laravel 的内部组件在框架顶层构建自己的功能。今天的教程我们将讨论管道设计模式以及如何使用 Laravel 的内部管道。

什么是管道设计模式?
管道模式用于将复杂的进程分解成多个独立的子任务。每个独立的任务都是可复用的,因此这些任务可以被组合成复杂的进程。

这种模式允许你讲庞大的进程分解成更小的子任务,这些子任务将数据进行处理并将处理后的结果传递给下一个子任务。就像流水线一样,有条不紊,从原料加工到成品,实现一道完整的工序。

管道中的每一个任务都会接受并返回同一类型的数据,这样子任务可以在管道中被添加、移除或者替换,而不影响其它子任务。

如果你熟悉 Unix 系统的话,你可能对管道并不陌生,因为在 shell 命令中我们经常会使用管道命令,例如:


在这个例子中,我们读取文件内容,并在其中查询字符串“hello world”,反转字符串,并最终将其添加到 output.txt 文件中。

Laravel中如何使用管道模式?
Laravel 在框架中的很多地方使用了管道设计模式,最常见的就是中间件的实现。

当请求最终到达控制器动作被处理前,会先经过一系列的中间件。每个中间价都有一个独立的职责,例如,设置 Cookie、判断是否登录以及阻止 CSRF 攻击等等。

每个阶段都会对请求进行处理,如果请求通过就会被传递给下一个处理,不通过就会返回相应的 HTTP 响应。

这种机制使得我们很容易在请求最终到达应用代码前添加处理操作,当然如果不需要这个处理操作你也可以随时移除而不影响请求的生命周期。

管道模式的优点
管道模式有很多优点:

首先,将复杂的处理流程分解成独立的子任务,从而方便测试每个子任务;

其次,被分解的子任务可以被不同的处理进程复用,避免代码冗余。

最后,在复杂进程中添加、移除和替换子任务非常轻松,对已存在的进程没有任何影响。

管道模式的缺点
当然,管道模式也有缺点:

虽然每个子任务变得简单了,但是当你再度尝试将这些子任务组合成完整进程时有一定复杂性;

此外你还需要保证独立子任务测试通过后整体的流程能正常工作,这有一定的不确定性。

最后,当你看到的都是一个个子任务时,对理解整体流程带来困难(盲人摸象的故事想必大家很熟悉,正是此理)。

如何使用Laravel的管道
使用 Laravel 提供的管道很简单,首先需要创建一个新的 Illuminate\Pipeline\Pipeline 对象,并将其注入到某个 Illuminate\Contracts\Container\Container 的实例:

接下来将你想要传递的对象发送这个管道:
然后将其传递到接受并处理请求的任务数组:
最后运行管道任务并编写回调处理:
这就是中间件的基本工作原理:接收 HTTP 请求,让请求经过定义好的路由中间件,最后到达目的地进行处理。

如果有想要学习php的小伙伴,可来我们的php自家群学习哦扣裙:722584796 ,tp5、laravel、YII、微信开发性能、队列、高并发、rpc接口、swoole等技术系列教学视频和资料可免费获取!小编也是从事了5年PHP项目开发经验的高级项目经理,欢迎初学者和想要进阶的同学进来一起学习。

结论
管道设计模式很有用,中间件只是一个特别的例子,Laravel 在框架底层中充分利用了该设计模式,当然你也可以在自己的项目中使用 Laravel 提供的管道。

Laravel 中管道设计模式的使用 —— 中间件实现原理探究相关推荐

  1. 浅谈Laravel中的设计模式(四) Contract 契约模式

    阅读时长:3分钟 技术预备:熟悉Laravel的使用 契约模式(Contract) 一.首先什么是契约模式呢? 学过Java的童鞋一定知道interface.抽象类之类的概念. 主要就是为了具有相同操 ...

  2. koa2异常处理_koa2 中的错误处理以及中间件设计原理

    其实这不是一个问题,因为就 koa2 而言,他已经帮我做好了统一错误处理入口 app.onerror 方法. 我们只要覆盖这个方法,就可以统一处理包括 中间件,事件,流 等出现的错误. 但我们始终会看 ...

  3. Android中模拟点击软件的实现原理探究

    简介 按键触摸类模拟点击软件最早开始于PC时代,指的是可以通过设置.脚本控制等方式去实现模拟点击,解放双手,达到自动化操作的目的.在Android中,模拟点击对应的就是触发屏幕点击事件,多用于游戏中完 ...

  4. js reduce实现中间件_简述 laravel中间件 的原理

    laravel的middleware中间件,使用了管道(pipe). 什么是管道呢? 管道类似水净化过程中的层层过滤. 中间件的意思就是说,在接下来的逻辑之前,需要的操作. 例如江河之水我们不能直接喝 ...

  5. Laravel中构造方法中不能写return!!!

    今天遇到的大坑 在laravel中 __construct 这个方法中不能写return 完全不能返回 而且还会向下执行 具体原因不知道为什么 解决办法!!!! 用中间件来实现就可以了 Over!!! ...

  6. laravel中artisan工具(命令)的使用详解

    artisan工具,首先,这个是一个php文件,它放在我们laravel框架的根目录 Artisan工具简介 Artisan 是 Laravel 中自带的命令行工具的名称.它提供了一些对您的应用开发有 ...

  7. laravel中guard是什么

    在laravel中,guard是一个用于用户认证的插件:guard的作用就是处理认证判断每一个请求,从数据库中读取数据和用户输入的对比,调用是否登录过或者允许通过的,并且Guard能非常灵活的构建一套 ...

  8. Springboot 使用管道设计模式 , 实践案例玩一玩

    前言 这段时间,学习群里大家讨论设计模式频率很高,可以看出来 日常搬砖 CRUD 已经让人从麻木到想脱离麻木,对代码有了些许追求. 当然也有还没放开的小伙(N重打码照顾兄弟),不敢参与讨论,但是私下还 ...

  9. php laravel terminate中间件 实现原理与实例

    总所周知,laravel中的中间件 分为 前置,后置,terminable中间件(也叫可终止的中间件),在官方文档中是这样介绍的       这样接下来看laravel的代码实现 首先我的larave ...

最新文章

  1. python设计及论文-python能否实现学术论文文本分析的功能?
  2. centos7 keepalived安装记录
  3. 参数化的JUnit测试
  4. linux 挂载32T文件系统,linux Centos下磁盘分区及文件系统创建与挂载(示例代码)
  5. Django终端运行报错:ImportError: DLL load failed while importing _sqlite3: 找不到指定的模块。
  6. 17毫秒每帧!实时语义分割与深度估计
  7. 深度学习笔记(三)——GAN入门实现MNIST数据集
  8. ubuntu hadoop安装教程
  9. 服务器软件系统日常运维工作制度
  10. markdown下载及基本语法
  11. 锐捷校园网:小米mini路由刷Padavan固件实现wifi上网
  12. 软件测试到底有多重要?
  13. amd cpu排行_最全cpu性能排行榜,cpu性能排行天梯图
  14. pkpm弹性时程分析计算书怎么出_一套软件,带你掌握复杂建筑结构分析方法
  15. MySQL 权限操作
  16. 软件开发自学靠谱吗?
  17. 一分钟让你知道如何删除PDF其中几页
  18. Git 基本操作(入职亲体验)
  19. 模拟电路 二极管门电路(二)
  20. 人民币大写的正确写法

热门文章

  1. Ubuntu16.04系统安装谷歌浏览器(Google chorm)与有道云词典
  2. 《21天学通C语言(第6版•修订版)》一导读
  3. elasticsearch6.6文档翻译-查询语句-查询上下文和过滤上下文
  4. STM32-(08):USART通信基础
  5. swift学习——点点滴滴——3~著名算法
  6. 李开复操刀的创新奇智敲钟在即,亏了11个亿的公司为何还能获得国家和市场的双重认可?...
  7. 什么是gpt一4-如何用上gpt-4
  8. 阿里/腾讯云静默安装Oracle11G超级详细教程
  9. html 悬浮菜单按钮,HTML右侧悬浮菜单
  10. 「POI2011 R1」Conspiracy