ThinkPHP6中间件实战:构建灵活可扩展的请求处理管道
ThinkPHP6的中间件机制提供了对HTTP请求进行分层处理的能力,本文将深入探讨如何利用中间件实现API鉴权、请求日志等常见功能,并通过完整案例展示其实际应用。
1. 中间件基础创建
创建一个记录请求日志的中间件:
namespace appmiddleware;
class RequestLog
{
public function handle($request, Closure $next)
{
// 前置中间件逻辑
$startTime = microtime(true);
// 记录请求信息
$logData = [
‘method’ => $request->method(),
‘path’ => $request->pathinfo(),
‘ip’ => $request->ip(),
‘time’ => date(‘Y-m-d H:i:s’)
];
// 执行下一个中间件/控制器
$response = $next($request);
// 后置中间件逻辑
$logData[‘duration’] = round(microtime(true) – $startTime, 3);
Log::write(json_encode($logData), ‘request’);
return $response;
}
}
2. 中间件注册与使用
全局中间件和应用中间件的配置方式:
return [
// 全局中间件
appmiddlewareRequestLog::class,
// 别名中间件
‘auth’ => appmiddlewareAuthCheck::class,
];
// 路由中使用
Route::rule(‘user/profile’, ‘user/profile’)
->middleware(appmiddlewareAuthCheck::class);
// 或使用别名
Route::rule(‘admin’, ‘admin/index’)
->middleware(‘auth’);
3. 实际案例:API鉴权中间件
实现一个JWT认证中间件:
class AuthCheck
{
public function handle($request, Closure $next)
{
$token = $request->header(‘Authorization’);
if (!$token) {
return json([‘code’ => 401, ‘msg’ => ‘Token缺失’]);
}
try {
$payload = JwtUtil::verify($token);
$request->user = UserModel::find($payload->uid);
} catch (Exception $e) {
return json([‘code’ => 403, ‘msg’ => ‘Token无效’]);
}
return $next($request);
}
}
4. 中间件执行顺序控制
通过中间件优先级控制执行顺序:
return [
// 先执行
appmiddlewareCors::class,
// 后执行
appmiddlewareRequestLog::class => [‘priority’ => 10],
];
ThinkPHP6中间件为应用提供了强大的请求处理管道机制,通过合理设计中间件可以构建出高度可维护和可扩展的应用架构。