热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

Laravel中管道设计模式的使用--中间件实现原理探究

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

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

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

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

什么是管道设计模式?

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

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

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

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

cat helloworld.txt | grep "hello world" | rev | > output.txt

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

Laravel中如何使用管道模式?

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

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

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

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

管道模式的优点

管道模式有很多优点:

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

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

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

管道模式的缺点

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

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

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

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

如何使用Laravel的管道

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

$pipeline = app('Illuminate\Pipeline\Pipeline');

接下来将你想要传递的对象发送这个管道:

$pipeline->send($request);

然后将其传递到接受并处理请求的任务数组:

$pipeline->through($middleware);

最后运行管道任务并编写回调处理:

$pipeline->then(function ($request) {    // Do something});

这就是中间件的基本工作原理:接收 HTTP 请求,让请求经过定义好的路由中间件,最后到达目的地进行处理。

结论

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

如果你想使用不依赖于任何框架的管道,可以参考这个 Github 项目: League\Pipeline

声明:本文为英文译文,原文: How to use the Pipeline Design Pattern in Laravel

推荐阅读
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
  • 本文详细介绍了如何在 Spring Boot 应用中通过 @PropertySource 注解读取非默认配置文件,包括配置文件的创建、映射类的设计以及确保 Spring 容器能够正确加载这些配置的方法。 ... [详细]
  • 本章详细介绍SP框架中的数据操作方法,包括数据查找、记录查询、新增、删除、更新、计数及字段增减等核心功能。通过具体示例和详细解析,帮助开发者更好地理解和使用这些方法。 ... [详细]
  • Flowable系列教程:运用ProcessEngineConfigurator实现高级流程引擎配置
    本文探讨了通过ProcessEngineConfigurator接口实现对Flowable流程引擎的高级配置方法。这种方法允许开发者通过自定义配置器来增强或修改流程引擎的行为。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文介绍如何使用 Sortable.js 库实现元素的拖拽和位置交换功能。Sortable.js 是一个轻量级、无依赖的 JavaScript 库,支持拖拽排序、动画效果和多种插件扩展。通过简单的配置和事件处理,可以轻松实现复杂的功能。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 尽管PHP是一种强大且灵活的Web开发语言,但开发者在使用过程中常会陷入一些典型的陷阱。本文旨在列出PHP开发中最为常见的10种错误,并提供相应的预防建议。 ... [详细]
  • 本文详细解析了 SUCTF 2019 中的 EasySQL 题目,重点探讨了堆叠注入与 UNION 注入的区别及其应用条件。 ... [详细]
  • Waymo大规模采购FCA车型,软银巨资加码Cruise,无人驾驶商业化步伐加快
    近期,无人驾驶领域迎来两项重大进展:软银以22.5亿美元投资通用汽车旗下的Cruise Automation,同时Waymo宣布向菲亚特克莱斯勒采购62000辆厢式车。这些动向不仅提升了行业信心,也为无人驾驶技术的商业化铺平了道路。 ... [详细]
  • 本文探讨了如何在FastAPI中有效使用嵌套依赖注入,通过具体示例展示了如何优化API设计,提高代码的可维护性和复用性。 ... [详细]
author-avatar
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有