本文目录导读:

在ThinkPHP框架中,中间件的执行顺序遵循先注册先执行的原则,即先进先出(FIFO),下面是详细的执行顺序说明:
全局中间件执行顺序
全局中间件(app/middleware.php)
// app/middleware.php
return [
// 按数组顺序执行
\app\middleware\CheckToken::class, // 第1个执行
\app\middleware\CheckPermission::class, // 第2个执行
\app\middleware\Log::class, // 第3个执行
];
执行流程:
请求 → CheckToken → CheckPermission → Log → 控制器 → 响应
← Log ← CheckPermission ← CheckToken ← 响应
应用中间件(应用下的middleware.php)
// app/admin/middleware.php
return [
\app\middleware\Auth::class,
];
路由中间件
Route::group('admin', function() {
Route::get('list', 'User/list')->middleware([
\app\middleware\CheckAuth::class,
\app\middleware\CheckLogin::class
]);
});
控制器中间件
class User extends BaseController
{
protected $middleware = [
'checkLogin' => ['only' => ['index', 'edit']],
'checkPermission' => ['except' => ['login']],
];
}
完整执行顺序总结
全局中间件 → 应用中间件 → 路由分组中间件 → 路由中间件 → 控制器中间件 → 控制器方法
中间件嵌套执行顺序
// 定义多个中间件
return [
'A' => \app\middleware\AMiddleware::class,
'B' => \app\middleware\BMiddleware::class,
'C' => \app\middleware\CMiddleware::class,
];
// 注册顺序
[
'A',
'B',
'C'
]
执行流程:
请求 → A中间件(入口) → B中间件(入口) → C中间件(入口) → 控制器
↓ ↓ ↓
响应 ← A中间件(出口) ← B中间件(出口) ← C中间件(出口) ← 响应
中间件实现示例
<?php
namespace app\middleware;
class TestMiddleware
{
public function handle($request, \Closure $next)
{
// 前置操作(在下一个中间件或控制器之前执行)
echo '中间件入口<br>';
// 执行下一个中间件或控制器
$response = $next($request);
// 后置操作(在响应返回之前执行)
echo '中间件出口<br>';
return $response;
}
}
优先级说明
- 全局中间件 > 应用中间件 > 路由中间件 > 控制器中间件
- 同一层级的中间件按定义顺序执行
- 多个中间件形成嵌套结构,类似洋葱模型
配置优先级
// 不同的配置方式优先级 1. 全局配置文件(最低) 2. 应用配置(居中) 3. 路由配置(较高) 4. 控制器属性(最高)
如果要控制某个中间件的执行优先级,可以通过注册顺序或使用优先级参数来调整。