Laravel 10验证:能否将嵌套属性meta.*的错误合并到meta属性下?
合并嵌套数组字段的验证错误到统一属性
直接在attributes()方法里使用meta.*只能重命名字段显示名,无法合并多个meta.x的错误条目到meta属性下。要实现这个需求,需要重写Request类的failedValidation方法,手动处理验证错误集合:
步骤1:重写failedValidation方法
在你的表单请求类中添加以下代码,收集所有meta.*的错误并合并到meta字段:
use Illuminate\Contracts\Validation\Validator; use Illuminate\Http\Exceptions\HttpResponseException; protected function failedValidation(Validator $validator) { $errors = $validator->errors(); // 收集所有meta前缀的错误 $metaErrors = []; foreach ($errors->keys() as $key) { if (str_starts_with($key, 'meta.')) { $metaErrors = array_merge($metaErrors, $errors->get($key)); $errors->forget($key); } } // 将合并后的错误添加到meta字段 if (!empty($metaErrors)) { $errors->add('meta', $metaErrors); } // 保持原有错误处理逻辑 parent::failedValidation($validator); }
如果是API请求需要返回JSON响应,可替换最后一行的parent::failedValidation($validator)为:
throw new HttpResponseException(response()->json([ 'message' => '验证失败', 'errors' => $errors ], 422));
步骤2:统一错误消息(可选)
如果你想让所有meta.*的错误使用统一文本,可在Request类的messages()方法中定义:
public function messages(): array { return [ 'meta.*.min' => '附加描述长度至少为30字符', // 根据你的验证规则添加对应的消息 ]; }
这样处理后,所有meta.0、meta.1等字段的错误会被合并到meta属性下,页面或接口就能获取到统一的meta错误集合。
内容的提问来源于stack exchange,提问作者Sasha
相关产品推荐
相关产品推荐

