Laravel CLI环境下Request::create与Request::input配合失效求助
问题分析与解决方案
你遇到的核心问题是请求参数的添加时机错了——你先分发(dispatch)了请求,之后才往Request对象里加参数,这时候已经晚了:
当你调用Route::dispatch($request)时,Laravel已经基于当时的Request实例完成了路由处理,Request facade此时绑定的是分发时那个没有adjustment参数的实例。后续你修改本地的$request变量,并不会同步到facade指向的实例(或者说请求周期已经结束,facade的上下文已经变化),所以调用Request::input('adjustment')自然会返回null。
正确做法:先加参数,再分发请求
把添加参数的代码放到dispatch之前,确保请求分发时已经包含所需参数:
// 创建请求实例 $request = \Illuminate\Support\Facades\Request::create('script/run', 'POST'); // 先将参数添加到请求中 $request->request->add(['adjustment' => '10']); // 再分发请求 \Illuminate\Support\Facades\Route::dispatch($request); // 此时调用input就能获取到对应值 dd(\Illuminate\Support\Facades\Request::input('adjustment'));
特殊场景:必须在分发后修改参数?
如果因为某些特殊需求,你确实需要在分发请求后修改参数并让后续代码能获取到,可以手动将修改后的Request实例重新绑定到服务容器,强制让Request facade使用这个更新后的实例:
$request = \Illuminate\Support\Facades\Request::create('script/run', 'POST'); \Illuminate\Support\Facades\Route::dispatch($request); // 添加参数 $request->request->add(['adjustment' => '10']); // 重新绑定到容器,更新facade的指向 app()->instance('request', $request); // 现在就能正常获取参数了 dd(\Illuminate\Support\Facades\Request::input('adjustment'));
不过这种做法不符合常规的请求流程,除非有特殊业务需求,否则优先选择第一种“先加参数再分发”的方案。
内容的提问来源于stack exchange,提问作者Jaikar
相关产品推荐
相关产品推荐

