PHP项目ThinkPHP中间件执行顺序

wen PHP项目 3

本文目录导读:

PHP项目ThinkPHP中间件执行顺序

  1. 全局中间件执行顺序
  2. 应用中间件(应用下的middleware.php)
  3. 路由中间件
  4. 控制器中间件
  5. 完整执行顺序总结
  6. 中间件嵌套执行顺序
  7. 中间件实现示例
  8. 优先级说明
  9. 配置优先级

在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. 多个中间件形成嵌套结构,类似洋葱模型

配置优先级

// 不同的配置方式优先级
1. 全局配置文件(最低)
2. 应用配置(居中) 
3. 路由配置(较高)
4. 控制器属性(最高)

如果要控制某个中间件的执行优先级,可以通过注册顺序或使用优先级参数来调整。

抱歉,评论功能暂时关闭!