yii2自定义验证传参分内联和独立类两种:内联用匿名函数接收$params数组;独立类需声明public属性并在rules中赋值;特殊参数when和skiponempty控制执行逻辑;each嵌套时参数须置于子规则内。

Yii2 自定义验证中传递自定义参数,取决于你用的是内联验证器还是独立验证类,方式不同但都很直接。
内联验证器传参:靠 $params 数组
内联验证器写在 rules() 里,签名固定为 function($model, $attribute, $params)。其中 $params 就是你传进去的自定义参数容器。
- 规则写法示例:
['password_repeat', function ($model, $attribute, $params) { /* 这里能访问 $params['message'] 或 $params['strict'] */ }, 'message' => '密码不一致', 'strict' => true] - $params 是 rules 数组中除前两个元素(属性名、验证器)外所有键值对的集合,自动打包传入
- 注意不能只写方法名字符串(如
'checkPassword'),必须用匿名函数或[$this, 'methodName']数组语法,否则 $params 不会被传入
独立验证类传参:声明 public 属性 + rules 中赋值
如果你把验证逻辑抽成类(比如 PhoneValidator),参数要通过 public 属性 声明,并在 rules 中显式传入。
- 类中定义:
public $country = 'CN'; public $strict = false; - rules 中使用:
['mobile', 'PhoneValidator', 'country' => 'US', 'strict' => true] - 类内部可在
validateAttribute()里直接用$this->country和$this->strict - 别忘了在
init()方法里调用parent::init(),否则$this->message等基础属性不会初始化
特殊参数:when 和 skipOnEmpty 的配合
这两个不是“业务参数”,但属于 Yii2 验证器的控制型参数,常和自定义逻辑一起用:
-
'when' => function ($model) { return $model->status === 1; }:决定该条规则是否执行 -
'skipOnEmpty' => false:即使字段为空也强制校验(默认为 true,空值会跳过) - 两者可共存,
when先判断是否进入验证流程,skipOnEmpty再决定空值是否跳过——顺序不能反
嵌套 rule 场景(如 each + integer)传参
当用 each 包裹子规则时,参数要写在子规则数组里:
- 正确写法:
['ids', 'each', 'rule' => ['integer', 'min' => 1, 'max' => 999]] - 错误写法:
['ids', 'each', 'rule' => 'integer', 'min' => 1](min会挂在 each 上,而非 integer 验证器) - 子规则的参数必须和验证器原生支持的属性名完全一致(如
NumberValidator的min、max)











