装饰器模式在Laravel中的应用学习笔记
内容来自 - 《Laravel框架关键技术解析》
装饰器模式在Laravel中的(请求中间件)的应用,简单例子
<?php
interface Middleware
{
public static function handle(Closure $next);
}
class StartSession implements Middleware
{
public static function handle(Closure $next)
{
echo "开启session,获取数据" . PHP_EOL;
$next();
echo "保存数据,关闭session" . PHP_EOL;
}
}
class EncryptCookies implements Middleware
{
public static function handle(Closure $next)
{
echo "对输入请求的cookie进行解密" . PHP_EOL;
$next();
echo "对输出请求的cookie进行加密" . PHP_EOL;
}
}
function getSlice()
{
return function ($stack, $pipe) {
return function () use ($stack, $pipe) {
return $pipe::handle($stack);
};
};
}
function then()
{
$pipes = [
'EncryptCookies',
'StartSession'
];
$firstSlice = function () {
echo "请求向路由器传递,返回响应" . PHP_EOL;
};
$pipes = array_reverse($pipes);//反转数组
//$firstSlice作为第一个参数传递给getSlice处理,$pipes元素的第一个参数(StartSession)作为getSlice第二个参数传入处理
//getSlice第一次执行返回的结果作为第二次调用getSlice的第一个参数,$pipes的第二个元素(EncryptCookies)作为getSlice第二个参数传入处理
//以此类推
call_user_func(
array_reduce($pipes, getSlice(), $firstSlice)
);
//$a = function () {
// return StartSession::handle($firstSlice);
// }
//$b = function () {
// return EncryptCookies::handle($a);
// }
//$b()
}
then();