包洋葱——laravel 管道及中间件源码分析

2022-02-1420:58:20后端程序开发Comments1,343 views字数 1949阅读模式

通过一个简单的实例让我们熟悉关于 laravel 管道及中间件的实现过程。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/23166.html

管道(包洋葱的概念)在laravel 中是将要执行的控制器的方法做为洋葱心,而多个中间件(中间件提供了一种方便的机制过滤进入应用程序的 HTTP 请求。)做为洋葱皮的概念。
核心知识点:返回闭包函数、开始包洋葱: array_reduce()
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/23166.html

直接上代码了文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/23166.html

/**
* [管道(包洋葱的概念)
* 在laravel 中是将要执行的控制器的方法做为洋葱心,
* 而多个中间件(中间件提供了一种方便的机制过滤进入应用程序的 HTTP 请求。)做为洋葱皮的概念]
*
* 核心知识点:返回闭包函数、开始包洋葱: array_reduce()
*
* @Author leeprince:2020-03-17 00:59
*/

/**
* [中间件 - Middleware01]
*
* @Author leeprince:2020-03-17 01:03
*/
class Middleware01 {
public static function handle(Closure $next)
{
var_dump('Middleware01 - 我是控制器的前置操作');
$next();
var_dump('Middleware01 - 我是控制器的后置操作');
}
}
/**
* [中间件 - Middleware02]
*
* @Author leeprince:2020-03-17 01:03
*/
class Middleware02 {
public static function handle(Closure $next)
{
var_dump('Middleware02 - 我是控制器的前置操作');
$next();
var_dump('Middleware02 - 我是控制器的后置操作');
}
}

/**
* [中间件 - Middleware03]
*
* @Author leeprince:2020-03-17 01:03
*/
class Middleware03 {
public static function handle(Closure $next)
{
var_dump('Middleware03 - 我是控制器的前置操作');
$next();
var_dump('Middleware03 - 我是控制器的后置操作');
}
}

Class Controller {
public static function index()
{
var_dump('我是控制器');
}
}

/**
* [管道]
*
* @Author leeprince:2020-03-17 01:09
*/
class Pipeline
{
// 管道类的数组 - 即存放中间件
protected $pipes = [
'Middleware01',
'Middleware02',
'Middleware03',
];

/**
* [运行带有最终目标(洋葱心,即控制器的方法)回调的管道。]
*
* @Author leeprince:2020-03-17 01:15
* @param Closure $destination
* @return mixed
*/
public function then(Closure $destination)
{
$pipeline = array_reduce(
array_reverse($this->pipes), $this->carry(), $this->prepareDestination($destination)
);

return $pipeline();
}

/**
* [获取最后一块闭合的洋葱心,即控制器的方法]
*
* @Author leeprince:2020-03-17 01:29
* @param Closure $destination
* @return mixed
*/
public function prepareDestination(Closure $destination)
{
return function () use ($destination) {
return $destination();
};
}

/**
* [获取一个代表洋葱切片的闭包。]
*
* @Author leeprince:2020-03-17 01:24
* @return Closure
*/
protected function carry()
{
return function ($stack, $pipe) {
return function () use ($stack, $pipe){
return $pipe::handle($stack);
};
};
}
}

// 调用管道
$pipe = new Pipeline();
$pipe->then(function () {
return (new Controller())->index();
});

执行结果文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/23166.html

包洋葱——laravel 管道及中间件源码分析文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/23166.html

源码地址文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/23166.html

https://github.com/leeprince/my_pattern/tree/master/pipeline文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/23166.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/23166.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定