Laravel框架中管道设计模式之中间件的基本工作原理

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 提供的管道。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


如何利用Laravel实现数据缓存功能
Laravel权限功能的实战应用:如何实现用户组织架构权限控制
如何在Laravel中实现基于权限的多语言支持
掌握Laravel控制台命令,利用参数传递的力量
如何利用Laravel实现数据分页和搜索功能
如何在Laravel中使用中间件进行日志记录
如何在Laravel中使用中间件进行数据迁移
如何在Laravel中使用中间件进行数据统计
如何利用Laravel实现邮件发送和接收功能
如何在Laravel中使用中间件进行数据导出
Laravel权限功能详解:如何定义和管理用户角色
如何在Laravel中使用中间件进行用户反馈
如何使用Laravel开发一个基于微信公众号的在线点餐系统
Laravel权限功能的可靠性保证:如何实现权限的冗余备份和恢复
Laravel权限功能的进阶应用:如何实现权限的可视化管理和配置
如何在Laravel中使用中间件进行数据加密传输
Laravel权限功能的最佳实践:如何实现权限缓存和性能优化
如何在Laravel中使用中间件进行API认证
如何在Laravel中使用中间件进行数据加速
如何利用Laravel实现数据验证和过滤功能