Yii2中验证数组内每个元素最直接标准的方式是使用each验证器,它专为字段值是数组的场景设计,确保每个元素满足指定规则,如['deleteIds', 'each', 'rule' => ['integer']]可校验整数类型并定位错误下标。

Yii2 中验证数组内每个元素,最直接、标准的方式是使用 each 验证器。它专为“字段值是数组”这一场景设计,能确保数组中每一项都满足指定规则,而不是把整个数组当做一个整体去校验。
用 each 验证数组元素是否符合基础类型
比如表单提交了一个 deleteIds 字段,预期是整数 ID 列表:
- 规则写法:
['deleteIds', 'each', 'rule' => ['integer']] - 效果:若传入
[1, "abc", 3],会报错“deleteIds[1]必须是整数”,定位到具体下标 - 注意:
each本身不校验字段是否为数组,只校验“如果是数组,每个元素必须满足 rule”。如需确保字段本身是数组,应额外加一条['deleteIds', 'safe']或配合自定义逻辑判断is_array()
嵌套 rule 实现带参数的元素级校验
each 的 rule 支持完整验证器配置,可复用所有内置验证器能力:
- 限制整数范围:
['deleteIds', 'each', 'rule' => ['integer', 'min' => 1, 'max' => 99999]] - 校验字符串长度:
['tags', 'each', 'rule' => ['string', 'min' => 2, 'max' => 20]] - 组合多个规则(需用
filter或前置处理):each 不支持直接写多个 rule,但可通过自定义验证类或先用filter清洗数据再验证
校验数组元素存在性(如关联 ID 是否真实)
单纯用 each + exist 会报错,因为 exist 默认查的是字段名对应数据库列。正确做法是配合 targetAttribute 映射:
- 错误写法:
['userIds', 'each', 'rule' => ['exist', 'targetClass' => User::class]](尝试查userIds字段) - 正确写法:
['userIds', 'each', 'rule' => ['exist', 'targetClass' => User::class, 'targetAttribute' => 'id']] - 含义:对
userIds数组中每个值,都去User表的id字段查是否存在
需要更复杂逻辑?用内联或独立验证类
each 适合通用结构化校验;若涉及元素间依赖、异步检查、或自定义错误提示格式,建议换方式:
-
内联验证器:在
rules()里写匿名函数,遍历数组手动校验,失败时调用$this->addError('field', 'xxx'),可精准控制每条错误信息 -
独立验证类:新建
UserIdsExistValidator extends Validator,重写validateAttribute(),支持复用、参数化和客户端验证扩展 - 注意:无论哪种,都要主动处理空数组、非数组输入等边界情况,避免 PHP 警告


















