今天就跟大家聊聊有关怎么实现laravel管道及中间件源码分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
通过一个简单的实例让我们熟悉关于 laravel 管道及中间件的实现过程。
管道(包洋葱的概念)在laravel 中是将要执行的控制器的方法做为洋葱心,而多个中间件(中间件提供了一种方便的机制过滤进入应用程序的 HTTP 请求。)做为洋葱皮的概念。
核心知识点:返回闭包函数、开始包洋葱: array_reduce()
直接上代码了
<?php
/**
* [管道(包洋葱的概念)
* 在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();
});
执行结果
看完上述内容,你们对怎么实现laravel管道及中间件源码分析有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4479011/blog/4539618