Laravel如何在中间件中修改自定义表单请求类的数据
问题根因
该问题由Laravel的请求实例解析和中间件执行的优先级导致:
自定义CustomRequest(FormRequest)的实例化解析时机,早于路由组内注册的自定义业务中间件的执行时机。你在中间件中调用merge()方法修改的是全局请求实例的参数数组,但注入到控制器的CustomRequest是提前完成实例化的,直接通过属性访问时无法读取到后续新增的参数。
可行解决方案
方案1:调整中间件优先级(最推荐)
将你的数据注入中间件注册到全局中间件栈的最顶部,或在app/Http/Kernel.php的$middlewarePriority数组中,将该中间件排在Illuminate\Routing\Middleware\SubstituteBindings::class之前,确保中间件的merge操作在CustomRequest实例化之前完成,后续解析的CustomRequest会自动携带新增参数。
方案2:中间件同时挂载动态属性
如果不方便调整中间件优先级,可以在中间件中除了调用merge合并参数外,直接给请求实例挂载动态属性,无论通过注入的CustomRequest还是request()助手都可以直接访问:
public function handle($request, Closure $next, ...$guards) { $newData = [...]; $request->merge(['newData' => $newData]); // 直接挂载动态属性,兼容FormRequest属性访问 $request->newData = $newData; return $next($request); }
方案3:CustomRequest重载数据获取逻辑
你也可以在自定义的CustomRequest类中重载all()方法,主动合并全局请求中的新增参数:
// CustomRequest类中新增 public function all($keys = null) { return array_merge(parent::all($keys), [ 'newData' => request('newData') ]); }
如果不需要参数参与验证,也可以直接通过$request->input('newData')方法读取参数,该方法会直接读取请求实例的最新参数数组,不受提前实例化的影响。
内容的提问来源于stack exchange,提问作者Alexey
相关产品推荐
相关产品推荐

