You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 15:22:36