Laravel嵌套数组验证异常:items.*规则校验通过但理应失败
问题原因
- 缺少
items字段本身的验证规则:这是最普遍的诱因。Laravel的嵌套通配符规则默认仅会在父字段存在且为数组类型时才会触发子级校验。你当前的规则里没有对根级items字段做required和array约束,如果请求里items字段缺失、或传递的不是数组格式,所有items.*开头的规则都会被直接跳过不会执行。 - 验证调用方式异常:如果你使用了
validateOnly等仅验证指定字段的方法,或是自定义了验证逻辑主动跳过了嵌套字段校验,也会导致该问题。 - Laravel版本过旧:低于5.4版本的Laravel对
*.通配符嵌套验证的支持存在缺陷,可能出现规则不生效的问题。
解决方案
- 首先补充
items字段的基础验证规则,修改后的完整规则如下:
'items' => ['required', 'array'], 'items.*.comment' => ['nullable', 'string'], 'items.*.link' => ['required', 'string', 'min:1'], 'items.*.name' => ['required', 'string', 'max:255'], 'line_color' => ['required', 'string', 'max:255'], 'name' => ['required', 'string', 'max:255'],
- 验证前打印
$request->all()的输出,确认请求参数的结构和你预期的嵌套数组结构一致,没有出现字段名拼写错误、参数层级错误的问题。 - 确认你使用的是标准的
$request->validate()全局验证方法,没有使用局部验证方法跳过嵌套字段校验。如果Laravel版本低于5.4,建议升级版本或手动遍历items数组做校验。
内容的提问来源于stack exchange,提问作者Takachi
相关产品推荐
相关产品推荐

