Yii2中验证数组类型需用'array'规则确保字段为PHP数组;可叠加each规则校验元素类型;必填非空数组需前置required规则;固定结构数组须自定义验证器。

在Yii2中验证用户提交的字段是否为合法数组类型,避免因传入字符串、null或对象导致后续逻辑出错。
使用内置规则 array
在模型的 rules() 方法中添加 'array' 规则,Yii2 会自动检查该属性是否为 PHP 数组(包括空数组)。
第一步:在模型类中定义规则,例如验证 tags 字段必须为数组:
['tags', 'array']
这一步不校验数组内元素类型,只确保 $model->tags 是 is_array() 为 true 的值。若传入 "abc" 或 null,验证直接失败并返回错误。
组合校验:数组 + 元素类型约束
当需要同时限制数组及其内部元素类型时,需叠加多个规则。
方法一:用 each 配合 inner rule
['tags', 'array'] → ['tags', 'each', 'rule' => ['integer']]
这表示 tags 必须是数组,且每个元素都必须是整数。若传入 ['a', 1],第二个规则会报错“a 不是有效整数”。
方法二:更严格的写法(推荐用于必填非空数组)
['tags', 'required'] → ['tags', 'array'] → ['tags', 'each', 'rule' => ['string', 'min' => 1]]
【注意:required 必须放在 array 前面,否则空数组会绕过 required 校验】
自定义数组结构验证
当数组有固定键名和类型要求(如 ['name' => '张三', 'age' => 25]),内置规则无法覆盖,需写自定义验证器。
在模型中定义 validateProfileArray 方法:
public function validateProfileArray($attribute, $params)
{
if (!is_array($this->$attribute)) {
$this->addError($attribute, 'profile 必须是数组');
return;
}
if (!isset($this->$attribute['name']) || !is_string($this->$attribute['name'])) {
$this->addError($attribute, 'profile.name 必须是非空字符串');
}
if (!isset($this->$attribute['age']) || !is_int($this->$attribute['age']) || $this->$attribute['age'] $this->addError($attribute, 'profile.age 必须是非负整数');
}
}
然后在 rules() 中注册:
['profile', 'validateProfileArray']


















