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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:10:26