Laravel验证结果按失败规则键化的实现方法求助
实现Laravel验证错误按规则分组返回
方法一:重写Form Request的failedValidation方法
如果项目使用Laravel的Form Request做验证,直接在自定义Request类中重写failedValidation方法,即可自定义错误返回格式:
namespace App\Http\Requests; use Illuminate\Contracts\Validation\Validator; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Exceptions\HttpResponseException; class YourCustomRequest extends FormRequest { // 定义验证规则 public function rules() { return [ 'primary_email' => 'required|email|unique:users,email', 'adults' => 'required|array|size:1', 'children' => 'required|array|size:2', ]; } // 自定义错误消息(可选,也可使用框架默认消息) public function messages() { return [ 'primary_email.unique' => 'Email already exists in SSO.', 'adults.size' => 'The adults array must contain 1 item.', 'children.size' => 'The children array must contain 2 items.', ]; } // 重写验证失败后的处理逻辑 protected function failedValidation(Validator $validator) { $errorMessages = []; // 获取每个字段的失败规则列表 $failedRules = $validator->failed(); // 遍历字段与规则,拼接目标格式的错误数组 foreach ($failedRules as $field => $rules) { $fieldErrors = []; foreach (array_keys($rules) as $rule) { // 将规则名转为小写(框架返回的规则名为大写,如UNIQUE) $ruleKey = strtolower($rule); // 获取对应字段+规则的错误消息 $fieldErrors[$ruleKey] = $validator->errors()->first("$field.$ruleKey"); } $errorMessages[$field] = $fieldErrors; } throw new HttpResponseException( response()->json([ 'errorMessages' => $errorMessages ], 422) ); } }
方法二:控制器内手动处理验证
若不使用Form Request,可直接在控制器中创建Validator实例并手动处理错误:
use Illuminate\Support\Facades\Validator; use Illuminate\Http\Exceptions\HttpResponseException; public function yourControllerMethod(Request $request) { $rules = [ 'primary_email' => 'required|email|unique:users,email', 'adults' => 'required|array|size:1', 'children' => 'required|array|size:2', ]; $messages = [ 'primary_email.unique' => 'Email already exists in SSO.', 'adults.size' => 'The adults array must contain 1 item.', 'children.size' => 'The children array must contain 2 items.', ]; $validator = Validator::make($request->all(), $rules, $messages); if ($validator->fails()) { $errorMessages = []; $failedRules = $validator->failed(); foreach ($failedRules as $field => $rules) { $fieldErrors = []; foreach (array_keys($rules) as $rule) { $ruleKey = strtolower($rule); $fieldErrors[$ruleKey] = $validator->errors()->first("$field.$ruleKey"); } $errorMessages[$field] = $fieldErrors; } throw new HttpResponseException( response()->json(['errorMessages' => $errorMessages], 422) ); } // 验证通过后的业务逻辑 return response()->json(['message' => 'Validation passed']); }
关键说明
$validator->failed()方法会返回字段与对应失败规则的数组,结构为['字段名' => ['失败规则名' => 规则参数]]- 遍历过程中将规则名转为小写,匹配对应错误消息,最终拼接成前端需要的
errorMessages结构
内容的提问来源于stack exchange,提问作者Andrew Steenbuck
相关产品推荐
相关产品推荐

