Yii2如何对数组类型的ID属性应用内置match验证规则?
Yii2 数组形式ID列表的验证方案(复用内置规则)
问题背景
模型中原本针对单个哈希格式ID的$id属性有如下验证规则,可有效验证单个ID(如$id = '17e94c10df492a39'):
return [ ['id', 'match', 'pattern' => '/^[a-f0-9]{16,32}$/i', 'on' => [self::SCENARIO_DEFAULT]], // ...其他验证规则 ];
现在需要验证数组形式的ID列表,例如:
$id_list = ['17e94c10df492a39','27e94c10df492a39','37e94c10df492a39'];
要求尽量复用现有规则或使用Yii2内置验证器,避免编写自定义验证器。
可行方案
方案1:使用each验证器复用现有规则
Yii2内置的each验证器专门用于验证数组元素,可直接复用你现有的match规则。假设数组属性名为id_list,添加如下规则即可:
return [ // 保留单个ID的原有验证规则 ['id', 'match', 'pattern' => '/^[a-f0-9]{16,32}$/i', 'on' => [self::SCENARIO_DEFAULT]], // 新增数组ID列表的验证规则 ['id_list', 'each', 'rule' => [ 'match', 'pattern' => '/^[a-f0-9]{16,32}$/i' ], 'on' => [self::SCENARIO_DEFAULT]], // ...其他验证规则 ];
each验证器会遍历数组中的每个元素,对每个元素执行内部的match正则验证- 直接复用原有的正则表达式,无需重复编写逻辑
- 如果需要确保数组不能为空,可额外添加
required规则:
['id_list', 'required', 'on' => [self::SCENARIO_DEFAULT]], ['id_list', 'each', 'rule' => [ 'match', 'pattern' => '/^[a-f0-9]{16,32}$/i' ], 'on' => [self::SCENARIO_DEFAULT]],
方案2:让单个属性兼容单值/数组输入
如果希望同一个$id属性既能接收单个ID,又能接收数组形式的ID列表,可以通过when条件判断切换验证逻辑:
return [ ['id', 'each', 'rule' => [ 'match', 'pattern' => '/^[a-f0-9]{16,32}$/i' ], 'when' => function ($model) { return is_array($model->id); }, 'on' => [self::SCENARIO_DEFAULT]], ['id', 'match', 'pattern' => '/^[a-f0-9]{16,32}$/i', 'when' => function ($model) { return !is_array($model->id); }, 'on' => [self::SCENARIO_DEFAULT]], // ...其他验证规则 ];
这种方式会根据$id的输入类型(单值/数组)自动选择对应的验证逻辑,无需额外新增属性。
内容的提问来源于stack exchange,提问作者The Bndr
相关产品推荐
相关产品推荐

