You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 20:35:03