Laravel 8+能否手动构造Request并传入路由实现跳转?
问题描述
我有一个Laravel 8项目,定义了如下路由:
Route::get('/route-path', 'Client\SomeController@someMethod')->name('MyRouteName');
对应的SomeController实现如下:
public function someMethod(Illuminate\Http\Request $request) { $field_1 = $request->f1; $field_2 = $request->f2; return view('my_view', compact('field_1', 'field_2')); }
我希望跳转到MyRouteName路由,但需要手动创建Request:
$request = new Illuminate\Http\Request(); $request->request->add([ 'f1' => 'value_1', 'f2' => 'value_2', ]); return redirect()->route('MyRouteName', $request);
请问这种方式能否实现传入自定义Request?若不可行,该如何实现?目前我无法进行测试。
解答
你这种方式不可行,原因如下:
redirect()->route()的第二个参数是路由占位符参数或URL查询参数,它不会接收并传递你手动创建的Request对象。传入Request时,Laravel会把它转为数组,但只会拼接对象自身的属性为查询字符串,和你添加到request属性里的内容无关,同时这也不符合HTTP重定向的逻辑。- 重定向本质是服务器返回3xx状态码,让浏览器发起新的GET请求,新请求的参数只能通过URL查询字符串或会话传递,无法直接传递自定义
Request对象。
正确实现分两种场景:
场景1:URL查询字符串传递参数
直接把参数数组传给route()方法,Laravel会自动拼接成URL查询字符串:
return redirect()->route('MyRouteName', [ 'f1' => 'value_1', 'f2' => 'value_2', ]);
控制器的someMethod里依然可以通过$request->f1、$request->f2获取值,因为GET请求的查询参数会被Laravel自动解析到Request对象中。
场景2:会话(Session)传递参数(适合敏感/大量数据)
如果参数不适合放在URL里,可以存入会话,重定向后再取出:
// 存入临时会话数据 session()->flash('custom_params', [ 'f1' => 'value_1', 'f2' => 'value_2', ]); return redirect()->route('MyRouteName');
然后在someMethod中获取:
public function someMethod(Illuminate\Http\Request $request) { $params = session()->pull('custom_params'); $field_1 = $params['f1'] ?? null; $field_2 = $params['f2'] ?? null; return view('my_view', compact('field_1', 'field_2')); }
session()->flash()让数据仅在下次请求有效,避免残留;pull()取出数据后会从会话中删除,同样能清理临时数据。
内容的提问来源于stack exchange,提问作者mpaw
相关产品推荐
相关产品推荐

