Laravel 如何向用户展示友好的表单验证错误提示信息
Laravel自定义表单验证友好错误提示方案
下面是3种常用的实现方案,可根据业务场景选择:
方法1:验证时直接传入自定义提示
在Validator::make方法的第三个参数传入对应规则的提示文案,适合单接口临时自定义提示的场景:
public function handleRegister(Request $request) { $validator = Validator::make($request->all(), [ 'name' => 'required|string|max:100|min:3', 'email' => 'required|email', 'phone' => 'required|regex:/^01[0125][0-9]{8}$/', 'password' => 'required|string|max:100|min:8' ], [ 'name.required' => '用户名不能为空', 'name.min' => '用户名长度不能少于3个字符', 'name.max' => '用户名长度不能超过100个字符', 'email.required' => '电子邮箱不能为空', 'email.email' => '请输入有效的电子邮箱格式', 'phone.required' => '手机号不能为空', 'phone.regex' => '请输入有效的11位埃及手机号', 'password.required' => '密码不能为空', 'password.min' => '密码长度不能少于8个字符', 'password.max' => '密码长度不能超过100个字符', ]); if ($validator->fails()) { return redirect()->back() ->with('errorForm', $validator->errors()->getMessages()) ->withInput(); } // 后续原有业务逻辑保持不变 try { User::create(['name' => $request->name, 'email' => $request->email, 'phone' => $request->phone, 'password' => Hash::make($request->password)]); return redirect()->back() ->with('success', '创建成功!'); } catch (\Exception $e) { return redirect()->back() ->with('error', '创建过程中出现错误!'); } return redirect(route('home')); }
方法2:全局修改验证提示语言包
适合全项目统一使用中文提示的场景,修改后所有验证逻辑都会自动生效,不需要单独配置:
- 新建
resources/lang/zh_CN/validation.php语言文件(如果没有中文语言包可自行创建) - 在文件的
attributes数组中添加字段和中文名称的映射:
'attributes' => [ 'name' => '用户名', 'email' => '电子邮箱', 'phone' => '手机号', 'password' => '密码', ],
配置完成后默认错误提示会自动替换字段名为中文,比如原本的name is required会自动变成用户名不能为空。
方法3:创建表单请求类统一处理
适合验证规则复用度高的场景,把验证逻辑和业务逻辑拆分,代码更规范:
- 运行命令生成请求类:
php artisan make:request RegisterRequest - 编辑
app/Http/Requests/RegisterRequest.php文件:
// 权限验证,所有人都可以提交注册请求 public function authorize() { return true; } // 定义验证规则 public function rules() { return [ 'name' => 'required|string|max:100|min:3', 'email' => 'required|email', 'phone' => 'required|regex:/^01[0125][0-9]{8}$/', 'password' => 'required|string|max:100|min:8' ]; } // 定义自定义提示文案 public function messages() { return [ 'name.required' => '用户名不能为空', 'name.min' => '用户名长度不能少于3个字符', // 其他规则提示和方法1配置一致即可 ]; }
- 控制器直接注入请求类,不需要手动写验证逻辑,验证不通过会自动跳转回上一页携带错误信息和旧输入:
public function handleRegister(RegisterRequest $request) { try { User::create(['name' => $request->name, 'email' => $request->email, 'phone' => $request->phone, 'password' => Hash::make($request->password)]); return redirect()->back() ->with('success', '创建成功!'); } catch (\Exception $e) { return redirect()->back() ->with('error', '创建过程中出现错误!'); } return redirect(route('home')); }
前端Blade模板错误展示示例
{{-- 统一展示所有错误 --}} @if(session('errorForm')) <div class="alert alert-danger"> <ul> @foreach(session('errorForm') as $fieldErrors) @foreach($fieldErrors as $error) <li>{{ $error }}</li> @endforeach @endforeach </ul> </div> @endif {{-- 单独展示对应字段的第一个错误 --}} @if(session('errorForm.name')) <div class="text-danger">{{ session('errorForm.name')[0] }}</div> @endif
内容的提问来源于stack exchange,提问作者Osama Amr
相关产品推荐
相关产品推荐

