ThinkPHP5.1x的中間件,其核心還是閉包函數的應用,來實現“責任鏈”模式:

模擬代碼:
<?php
//模擬的控制器
class Controller {
public function index($request) {
echo '控制器方法體',$request,'<br>';
}
}
//中間件
class Before1 {
public function handle($request, Closure $next) {
echo 'before1<br>'; //業務邏輯,注意前置與后置中間件業務邏輯代碼的位置
return $next($request);
}
}
//中間件
class Before2 {
public function handle($request, Closure $next) {
echo 'before2<br>';
return $next($request);
}
}
//中間件
class After1 {
public function handle($request, Closure $next) {
$response = $next($request);
echo 'after1<br>'; //業務邏輯,注意前置與后置中間件業務邏輯代碼的位置
return $response;
}
}
//中間件
class After2 {
public function handle($request, Closure $next) {
$response = $next($request);
echo 'after2<br>';
return $response;
}
}
class Middleware {
public static $queue; //中間件隊列
public static function init() {
//模擬的中間件,數量任意添加
self::$queue[] = [[After1::class, 'handle'], null];
self::$queue[] = [[After2::class, 'handle'], null];
self::$queue[] = [[Before1::class, 'handle'], null];
self::$queue[] = [[Before2::class, 'handle'], null];
//模擬的控制器
self::$queue[] = [[Controller::class, 'index'], null];
}
//調用中間件
public static function dispatch($request) {
call_user_func(self::resolve(), $request);
}
//返回閉包函數
public static function resolve(){
return function($request){
$middleware = array_shift(self::$queue);
if ($middleware != null) {
list($call, $param) = $middleware;
call_user_func_array($call, [$request, self::resolve()]); //執行中間件
}
};
}
}
$request = "模擬的request對象";
Middleware::init();
Middleware::dispatch($request);

