Yii2自定义验证器注入参数需声明public属性并在rules()中以key-value传参,如['mobile','PhoneValidator','strict'=>false];private/protected属性或构造函数传参无效。

Yii2 自定义验证器注入参数,核心是通过 public 属性声明 + rules() 中传参 实现,不是靠构造函数传参,也不是用 DI 容器自动注入。
参数必须声明为 public 属性
在自定义验证类中,所有需要外部传入的配置项(如 $strict、$minLength)都得定义为 public 成员变量:
- ✅ 正确写法:
public $strict = true;或public $targetClass; - ❌ 错误写法:用
private或protected,或只在__construct()里接收参数(框架不会调用带参构造)
rules() 中按 key-value 方式传入参数
在模型的 rules() 方法里,把参数以关联数组形式写在验证器配置项中:
-
['mobile', 'PhoneValidator', 'strict' => false]→ 框架会自动把strict值赋给验证器的$strict属性 - 支持多个参数:
['id', 'ExistValidator', 'targetClass' => User::class, 'targetAttribute' => 'id'] - 参数名必须与 public 属性名完全一致(区分大小写)
注意 when 和 skipOnEmpty 的默认行为
这两个也是常见参数,但它们有特殊逻辑:
-
$this->when控制“是否执行该条验证”,默认不设值即始终执行 -
$this->skipOnEmpty控制“值为空时是否跳过验证”,默认是true(跳过),和when不是一回事,别混用 - 若需空值也校验,显式写
'skipOnEmpty' => false
嵌套规则里也能传参(比如 each + integer)
当用 each 包裹其他验证器时,内层规则的参数写法一样:
['deleteIds', 'each', 'rule' => ['integer', 'min' => 1]]- 这里
min会被注入到yii\validators\NumberValidator的$min属性中 - 本质是 Yii 解析
rule数组后,再按相同机制做属性赋值


















