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();
});
执行结果
源码地址
https://github.com/leeprince/my_pattern/tree/master/pipeline
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
软件的Alpha、Beta、GM、OEM、LTS等版本的含义
常用版本号: Alpha:软件或系统的内部测试版本,会有很多Bug,仅内部人员使用 Beta:软件或系统的测试版本,这一版本通常是在Alpha版本后,会有很多新功能,同时也有不少Bug Gamma:软件或系统接近于成熟的版本,只需要做一些小的改进就能发行 微软常用的版本号: RC(Release Candidate):候选版本,这一版本不会增加新功能,多要进行Debug GA(General Available):正式发布版本,这个版本就是正式的版本 RTM(Release to Manufacture):给工厂大量生产的压片版本,与正式版内容一样 OEM(Original Entrusted Manufacture):给计算机厂商的出场销售版本,不零售只预装 RVL:号称是正式版,其实RVL根本不是版本的名称。它是中文版/英文版文档破解出来的 EVAL:而流通在网络上的EVAL版,与“评估版”类似,功能上和零售版没有区别 RTL(Retail):零售版是真正的正式版,正式上架零售版 苹果常用的版本号: GM(Gold Master):正式版前最后一个测试版,其实也就是正式版 谷歌Ch...
-
下一篇
select * from t where c=5 for update 排它锁
RC隔离级别下, 对非索引字段更新,有个锁全表记录的过程, 不符合条件的会及时释放行锁,不必等事务结束时释放; 而直接用索引列更新,只会锁索引查找值和行。 update产生的X锁在不释放的情况下, DELETE语句无法执行, 但是UPDATE语句能更新不符合之前X锁的记录。 RR隔离级别下,为保证binlog记录顺序, 非索引更新会锁住全表记录, 且事务结束前不会对不符合条件记录有逐步释放的过程。 DELETE和UPDATE语句都不能执行 版本5.7.13 rc模式下: session 1: begin; select * from t where c=5 for update; session 2: delete from t where c=10 --等待 session 3: insert into t values(100001,8) --成功 session 4 : update t set c=100 where id=10 -- 成功 session 1: commit session 2:事务执行成功 rr模式下: begin; select * from t wher...
相关文章
文章评论
共有0条评论来说两句吧...




微信收款码
支付宝收款码