Laravel 9/10中如何在中间件响应中添加自定义数据
Laravel 9/10 中间件添加自定义数据实现方案
针对用户追踪系统的需求,结合JSON响应和路由跳转(重定向)场景,以下是具体实现步骤:
一、JSON响应场景处理
在中间件中直接修改JSON响应实例,添加自定义追踪数据,同时暂存数据用于后续保存和移除:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class AddTraceData { public function handle(Request $request, Closure $next) { $response = $next($request); // 仅处理JSON响应 if ($response instanceof \Illuminate\Http\JsonResponse) { $traceData = [ 'trace_id' => uniqid('trace_', true), 'user_id' => auth()->id() ?? null ]; // 合并原有JSON数据与自定义追踪数据 $originalData = $response->getData(true); $updatedData = array_merge($originalData, $traceData); $response->setData($updatedData); // 暂存追踪数据到请求属性,供后续保存使用 $request->attributes->set('trace_data', $traceData); } return $response; } }
二、路由跳转(重定向)场景处理
重定向响应无法修改响应体,只能通过自定义Header传递数据,同样暂存数据后续处理:
// 延续上述AddTraceData中间件的handle方法,添加重定向处理逻辑 if ($response instanceof \Illuminate\Http\RedirectResponse) { $traceData = [ 'trace_id' => uniqid('trace_', true), 'user_id' => auth()->id() ?? null ]; // 添加自定义Header $response->header('X-Trace-Id', $traceData['trace_id']); $response->header('X-User-Id', $traceData['user_id']); // 暂存追踪数据 $request->attributes->set('trace_data', $traceData); }
三、保存追踪数据并移除响应中的自定义内容
创建后置中间件,完成数据保存后,从响应中删除对应的字段或Header:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class SaveTraceData { public function handle(Request $request, Closure $next) { $response = $next($request); $traceData = $request->attributes->get('trace_data'); if (!$traceData) { return $response; } // 保存追踪数据到数据库/日志等(示例代码) // \App\Models\UserTrace::create([ // 'trace_id' => $traceData['trace_id'], // 'user_id' => $traceData['user_id'], // 'request_path' => $request->path() // ]); // 根据响应类型移除自定义内容 if ($response instanceof \Illuminate\Http\JsonResponse) { $data = $response->getData(true); unset($data['trace_id'], $data['user_id']); $response->setData($data); } elseif ($response instanceof \Illuminate\Http\RedirectResponse) { $response->headers->remove('X-Trace-Id'); $response->headers->remove('X-User-Id'); } return $response; } }
四、注册中间件
在app/Http/Kernel.php中注册两个中间件,确保AddTraceData在前,SaveTraceData在后:
protected $middlewareGroups = [ 'web' => [ // ...其他中间件 \App\Http\Middleware\AddTraceData::class, \App\Http\Middleware\SaveTraceData::class, ], 'api' => [ // ...其他中间件 \App\Http\Middleware\AddTraceData::class, \App\Http\Middleware\SaveTraceData::class, ], ];
关键说明
- 暂存数据使用
$request->attributes,避免全局变量污染,保证请求上下文隔离。 - 中间件顺序必须严格遵守:先添加数据,再保存并移除,否则会出现数据丢失或移除失败的情况。
- 可根据实际需求扩展追踪数据字段(如请求IP、请求方法等)。
内容的提问来源于stack exchange,提问作者Francisco Martinez
相关产品推荐
相关产品推荐

