laravel中间件通过管道模式统一拦截请求响应,支持闭包/类中间件、中间件组及terminate后置清理。需在kernel.php注册,handle处理逻辑,terminate执行异步任务。

如果您在Laravel应用中需要统一拦截请求或响应以执行认证、日志记录、权限校验等操作,则必须通过中间件机制实现。以下是深入Laravel中间件核心机制并自定义全局中间件的步骤:
一、理解中间件的生命周期与调用栈
Laravel中间件基于HTTP内核的管道(Pipeline)模式运行,所有中间件按注册顺序构成链式调用结构。请求进入时依次执行handle方法,响应返回时逆序执行后续逻辑(若存在)。中间件类必须实现Illuminate\Contracts\Http\Kernel接口约定,其核心是接收$request和$next参数,并返回$response。
1、中间件构造函数可接收依赖,由服务容器自动注入。
2、handle方法中调用$next($request)即向下游传递请求,其返回值为后续中间件处理后的响应对象。
3、若未调用$next($request),请求将被终止,此时需手动返回响应实例(如response()->json()或redirect())。
二、创建闭包中间件进行快速验证
闭包中间件适用于临时性、轻量级的全局逻辑,无需单独文件,直接在app/Http/Kernel.php中定义,便于调试和原型验证。
1、打开app/Http/Kernel.php文件,在$middleware数组中添加匿名函数。
2、编写闭包:function ($request, Closure $next) { if (! $request->hasHeader('X-App-Key')) { return response('Unauthorized', 401); } return $next($request); }。
3、该闭包会在每次请求时执行,检查请求头是否存在X-App-Key字段,缺失则立即返回401响应。
三、生成类中间件并注册为全局中间件
类中间件支持复用、测试与依赖注入,是生产环境推荐方式。其本质是实现了handle方法的PHP类,Laravel会自动解析其实例。
1、执行php artisan make:middleware CheckApiVersion命令生成中间件类文件。
2、在handle方法中编写逻辑:if ($request->header('Accept-Version') !== 'v2') { return response()->json(['error' => 'Unsupported version'], 400); }。
3、将新中间件类全限定名添加至app/Http/Kernel.php中的$middleware数组,例如\App\Http\Middleware\CheckApiVersion::class。
四、利用中间件组管理不同作用域逻辑
中间件组允许将多个中间件绑定到单一键名,便于在路由或控制器中批量启用,同时支持全局注册。此机制不改变中间件执行顺序,仅提供组织维度的抽象。
1、在app/Http/Kernel.php的$middlewareGroups数组中新增键值对,例如'api_secure' => [ \App\Http\Middleware\EncryptCookies::class, \App\Http\Middleware\CheckApiVersion::class ]。
2、在RouteServiceProvider中,于mapApiRoutes方法内调用Route::middleware('api_secure')将该组应用于/api路由前缀下所有路由。
3、若需全局生效,可将该组键名加入$middleware数组,如'middleware' => ['api_secure'],但需注意其内部中间件已包含在全局链中,避免重复注册。
五、重写terminate方法实现后置清理操作
terminate方法在响应已发送至客户端后异步触发,适用于日志写入、性能统计、资源释放等非阻塞任务。该方法仅在中间件被注册为全局中间件且响应未被短路时执行。
1、在自定义中间件类中声明terminate方法,签名必须为terminate($request, $response)。
2、在方法体内调用Log::info('Request processed', ['url' => $request->fullUrl(), 'status' => $response->getStatusCode()])。
3、注意:terminate方法不接收$next参数,且不能修改响应内容,仅用于副作用操作。










