Laravel 10 动态数组验证:元素为字符串或含字符串的子数组
解决方案
你当前的验证规则存在逻辑冲突:answers.* 配置了 max:255,但当该位置的元素是数组时,这条规则会直接验证失败。要实现「数组元素既可以是字符串,也可以是包含字符串的子数组」的需求,可以通过自定义闭包规则结合分层验证来解决:
修正后的验证代码
$data = $request->validate([ 'answers' => ['required', 'array'], 'answers.*' => [ 'required', // 限制元素类型只能是字符串或数组 function ($attribute, $value, $fail) { if (!is_string($value) && !is_array($value)) { $fail("$attribute 必须是字符串或由字符串组成的数组。"); } }, ], // 验证子数组的元素:必填字符串,长度不超过255 'answers.*.*' => ['required', 'string', 'max:255'], ]);
规则细节说明
answers: 确保字段是必填的数组类型answers.*:required: 数组的每个元素都不能为空值- 自定义闭包:严格限制元素类型,避免出现数字、对象等不符合要求的类型
answers.*.*: 仅当answers.*是数组时触发,确保子数组的每个元素都是符合长度要求的字符串
适配字符串长度限制(可选)
如果需要同时限制字符串类型元素的长度(不超过255),可以结合Rule::when实现条件验证:
use Illuminate\Validation\Rule; $data = $request->validate([ 'answers' => ['required', 'array'], 'answers.*' => [ 'required', function ($attribute, $value, $fail) { if (!is_string($value) && !is_array($value)) { $fail("$attribute 必须是字符串或由字符串组成的数组。"); } }, // 仅当元素是字符串时,验证长度不超过255 Rule::when(fn($value) => is_string($value), ['max:255']), ], 'answers.*.*' => ['required', 'string', 'max:255'], ]);
内容的提问来源于stack exchange,提问作者clover
相关产品推荐
相关产品推荐

