ThinkPHP5.1x的中間件,其核心仍是閉包函數的應用,來實現「責任鏈」模式:php
模擬代碼:閉包
<?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);
獲得的輸出將會是:函數
before1
before2
控制器方法體模擬的request對象
after2
after1spa