yii2表单自定义验证通过rules()结合匿名函数或独立方法实现:匿名函数适用于简单一次性校验但不支持js验证;独立方法可复用且支持客户端验证;可通过$params传参实现动态验证逻辑;when选项可实现条件验证。

Yii2 表单自定义参数验证,核心是通过 模型规则(rules) 结合 自定义验证方法 或 匿名函数 实现。不需要额外扩展类,框架原生就支持。
在 rules() 中使用匿名函数验证
适合逻辑简单、仅用一次的校验,比如判断两个字段是否相等、数值范围依赖其他字段等:
- 在模型的
rules()方法中,用function ($attribute, $params)定义校验逻辑 - 校验失败时调用
$this->addError($attribute, '错误提示') - 注意:该方式不参与客户端验证(JS),只服务端生效
示例:要求 password_repeat 必须等于 password
public function rules()
{
return [
// 其他规则...
['password_repeat', function ($attribute) {
if ($this->password !== $this->password_repeat) {
$this->addError($attribute, '两次输入的密码不一致');
}
}],
];
}
定义独立的验证方法(推荐)
适合复用、逻辑较复杂或需支持客户端验证(配合 validator 配置)的场景:
- 在模型中新增一个 public 方法,如
validatePasswordRepeat() - 在
rules()中引用该方法名(字符串),不带括号 - 方法内部用
$this->addError()报错,Yii 会自动调用它
示例:
public function rules()
{
return [
['password_repeat', 'validatePasswordRepeat'],
];
}
public function validatePasswordRepeat($attribute, $params)
{
if ($this->password !== $this->password_repeat) {
$this->addError($attribute, '密码确认不正确');
}
}
传参给自定义验证方法(带 $params)
需要动态控制验证行为时(如指定最小长度、对比字段名),可通过 $params 传参:
- 在 rules 中以数组形式配置:
['attribute', 'validatorMethod', 'param1' => 'value1', ...] - 验证方法签名保持
function ($attribute, $params),$params 包含所有键值对
示例:验证某字段是否大于另一个字段的值
public function rules()
{
return [
['end_time', 'validateGreaterThan', 'compareAttribute' => 'start_time'],
];
}
public function validateGreaterThan($attribute, $params)
{
$compareAttr = $params['compareAttribute'] ?? null;
if ($compareAttr && !empty($this->$compareAttr) && !empty($this->$attribute)) {
if (strtotime($this->$attribute) $compareAttr)) {
$this->addError($attribute, "{$attribute} 必须晚于 {$compareAttr}");
}
}
}
结合内置 Validator 做条件验证
有时只需在特定条件下启用某个验证(如“当 status=2 时,reason 字段必填”),可用 when 选项:
-
when接收一个函数,返回 true 时才执行该条规则 - 函数参数为模型实例和当前属性名,可访问任意字段
示例:
public function rules()
{
return [
['reason', 'required', 'when' => function ($model) {
return $model->status == 2;
}, 'message' => '状态为“已拒绝”时,拒绝原因必须填写'],
];
}











