Laravel管道技术
2017/03/29 11:55 分类: 技术交流 浏览:165
今天由源码时代php培训学科周老师给大家讲解下Laravel管道技术,一起来学学吧!
什么是管道
所谓管道(Pipeline)设计模式就是将会数据传递到一个任务序列中,管道扮演者流水线的角色,数据在这里被处理然后传递到下一个步骤。
为什么使用管道
使用管道使用很多好处的,尤其是在单个任务中编写复杂处理代码时管道为我们提供了极大的便利,而且可以在管道中轻松添加、移除或者替换阶段任务。
Laravel中的管道
Laravel 在框架中的很多地方用到了 Pipeline 设计模式,这意味着所有我们需要实现管道设计模式的地方已然是应用底层的一部分了。
在laravel的一次请求中,整个数据的处理要经过很多步骤,可以比作洋葱,每一层都有一层的功能,通关层层处理,让数据成为最终想要的结果,难度在于每一层都要松耦合,可以随时在这些层之间添加新的功能,而不至于改动很大。从设计模式的角度来看这其实是一种装饰者模式。
什么是装饰者模式
在不修改原有类的情况下动态增加或减少一些功能,使原有类的扩展性大大增加。
装修者模式完成小明穿衣出门流程需求
以小明穿衣出门为需求,使用装修者模式,再不改变小明出门这个主类的前提下,给小明穿上衬衫和外套在出门。
在穿衣出门这件事情上,我们需要定义好,小明这个主体,和小明需要穿的衣服。
//定义统一的接口,用于显示最终的效果
interface Decorator {
public function display();
}
//定义小明出门的主体
class 小明 implements Decorator {
public function display() {
echo "我是小明,我出门了" . "<br>";
}
}
//定义衣服抽象类类
abstract class 衣服 implements Decorator {
private $component;
public function __construct(Decorator $component) {
$this->component = $component;
}
public function display() {
$this->component->display();
}
}
//定义衬衣这件具体的衣服
class 衬衣 extends 衣服 {
public function display() {
echo "穿上衬衣" . "<br>";
parent::display();
}
}
//定义外套这件具体的衣服
class 外套 extends 衣服 {
public function display() {
echo "穿上外套" . "<br>";
parent::display();
}
}
执行流程
//声明小明对象
$小明 = new 小明();
$穿上衬衣的小明 = new 衬衣($小明);
$穿上外套和穿上衬衣的小明 = new 外套($穿上衬衣的小明);
//输出穿衣完成然后出门
$穿上外套和穿上衬衣的小明->display();
执行结果:
laravel中的管道具体实现
laravel中的管道技术处理数据,也是和小明穿衣一样一层一层的处理。上述的小明穿衣是手动实例化各个环节,很直观,而larval中因为使用容器技术,实例化过程是通过服务容器自动完成的,实例间的功能调用也是通过闭包函数完成。
中间件技术原理
中间件是laravel 管道代表,使用管道技术原理模拟一次laravel 中间件VerifyCsrfToken 对数据的处理的整个过程
1.定义好Midleware 接口,只有一个方法,并且使用Closure约束,保障每次接受值都是一个闭包
interface Middleware {
public static function handle(Closure $next);
}
2.定义一个专门用于验证token的类
class VerifyCsrfToken implements Middleware {
public static function handle(Closure $next) {
echo "验证Csrf-Token" . "<br>";
$next();
}
}
3.创建闭包产生函数
function getSlice() {
return function($stack, $pipe) {
//将整个函数以闭包的形式保存起来,以供下一次执行
return function()use($stack, $pipe) {
return $pipe::handle($stack);
};
};
}
4.管道执行函数
function then() {
$pipes = [
" VerifyCsrfToken"
];
$firstSlice = function() {
echo "<h1>请求向路由传递,响应返回</h1>" . "<br>";
};
call_user_func(
array_reduce($pipes, getSlice(), $firstSlice)
);
}
then();
执行结果:
总结
管道技术其实是装修模式的另一种实现方式,其难点在于产生闭包的函数,和类参数的调用顺序。
可以简化理解为:
$f = function($stack, $pipe) {
//将整改函数 以闭包的形式保存
return function()use($stack, $pipe) {
return $pipe::handle($stack);
};
};
$pipes = [
" VerifyCsrfToken"
];
$firstSlice = function($a) {
echo "<h1>请求向路由传递,响应返回$a</h1>" . "<br>";
};
$func1=$f($firstSlice, $pipes[0]);
$fuc1();
赞 0