Laravel 5.4带输入与错误数据的back()在通配路由下失效
解决Laravel通配路由下
back()重定向后无法获取输入与错误数据的问题 这个问题我之前也碰到过,核心原因其实是重定向后的请求类型变化导致数据存储位置变了——当你在update方法里调用back()时,实际是发起了一个GET重定向请求到通配路由的index方法,原来PUT请求的输入和错误信息并没有附在这个新的GET请求里,而是存在了Session中,这就是直接从当前Request对象拿不到数据的关键。
下面给你具体的解决步骤:
1. 确保错误与输入正确存入Session
如果是自定义的错误处理(而非Laravel自带的validate自动处理),需要显式在重定向时携带错误和输入数据:
public function update(Request $request) { // 示例:自定义验证逻辑 $validator = \Illuminate\Support\Facades\Validator::make($request->all(), [ 'username' => 'required|string|min:3', // 其他验证规则 ]); if ($validator->fails()) { // 显式返回back并携带错误和旧输入 return back()->withErrors($validator)->withInput(); } // 正常业务逻辑处理... }
要是用Laravel自带的$request->validate()方法,验证失败时会自动执行上述操作,不用手动写这段代码。
2. 在index方法/视图中正确读取数据
因为数据存在Session里,不能直接从当前$request->input()获取,得用Laravel提供的工具:
- 获取旧输入:用
old()助手函数,视图里可以这么写:
如果要在<input type="text" name="username" value="{{ old('username') }}">index方法里获取,可以从Session读取:public function index(Request $request) { $oldInput = $request->session()->get('_old_input'); // 将数据传递到视图 return view('your_page', compact('oldInput')); } - 获取错误信息:Laravel会自动把错误信息注入到视图的
$errors变量中,直接在视图里使用即可:
如果要在@error('username') <div class="text-red-500">{{ $message }}</div> @enderrorindex方法里获取错误:$errors = $request->session()->get('errors');
3. 检查路由中间件配置
最后别忘了确认你的通配路由是否在web中间件组内——Session、CSRF保护这些功能都是由web中间件提供的,如果路由没在这个组里,Session根本无法工作,自然拿不到任何存储的数据:
// 确保路由包裹在web中间件组里 Route::middleware('web')->group(function () { Route::get('{catchall}', [ 'uses' => 'MyGenericController@index' ])->where('catchall', '(.*)'); Route::put('{catchall}', [ 'uses' => 'MyGenericController@update' ])->where('catchall', '(.*)'); });
按照上面的步骤操作,你就能在index方法或对应的视图里拿到之前的输入和错误数据了。
内容的提问来源于stack exchange,提问作者Anand Moghe
相关产品推荐
相关产品推荐

