Laravel验证失败后如何以POST方法重定向至POST路由?
解决方案
核心思路
绕过Laravel默认的GET重定向逻辑,在验证失败时直接返回原搜索页面的视图,同时传入验证错误信息和用户提交的旧数据,让浏览器保持POST请求的上下文,避免触发GET请求的路由不支持错误。
具体实现
修改CustomFormRequest.php中的failedValidation方法,替换默认的重定向处理逻辑:
use Illuminate\Http\Response; use Illuminate\Contracts\Validation\Validator; protected function failedValidation(Validator $validator) { // 闪存用户提交的旧数据到session,方便视图用old()回显 $this->flash(); // 直接返回搜索页面视图,传入错误信息 return response()->view('你的搜索页面视图名称', [ 'errors' => $validator->errors() ], Response::HTTP_UNPROCESSABLE_ENTITY); }
关键细节
- 把
你的搜索页面视图名称替换为实际的视图文件名(比如search或search.index,根据你的视图结构调整)。 $this->flash()会将当前请求的输入数据暂存到session,视图中可通过old('字段名')回显用户之前输入的内容。- 返回
422 Unprocessable Entity状态码,既符合规范,也能让页面明确识别这是验证失败的响应。
视图层适配
确保搜索视图正确展示错误信息和旧数据:
<!-- 显示验证错误 --> @if($errors->any()) <div class="alert alert-danger"> <ul> @foreach($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <!-- 表单回显旧数据 --> <form method="POST" action="{{ route('search') }}"> @csrf <input type="text" name="keyword" value="{{ old('keyword') }}"> <!-- 其他表单字段 --> <button type="submit">搜索</button> </form>
补充说明
- 关于请求方法的查看:在
failedValidation中直接调用$this->method()即可获取当前请求方法,比如:
之前用\Log::debug($this->method()); // 输出POST$this->request->method()可能因属性访问方式问题无法获取,直接使用FormRequest自身的method()方法更可靠。
内容的提问来源于stack exchange,提问作者Mr. Kenneth
相关产品推荐
相关产品推荐

