Yii2 的 compare 验证器用于校验两字段值相等或满足大小关系,支持 compareAttribute(字段间比较)、compareValue(与固定值比较)、operator(如>=、!=)及 strict 严格模式,默认启用客户端验证。

在 Yii2 中,使用 compare 验证器可轻松实现两个表单字段值是否相等(或满足大小关系)的校验,常用于密码确认、起止时间比对、金额范围验证等场景。
基础写法:验证两字段值完全相等
最常见的是「密码」与「确认密码」字段比对:
public function rules()
{
return [
// 确保 password_repeat 的值等于 password 字段
[['password_repeat'], 'compare', 'compareAttribute' => 'password'],
// 或简写为字符串形式(Yii2 支持)
['password_repeat', 'compare', 'compareAttribute' => 'password'],
];
}
说明:
-
compareAttribute指定被比较的字段名(必须是模型属性) - 不加
operator参数时,默认使用==进行值相等判断(类型宽松,如'1'和1视为相等) - 若需严格相等(含类型),可加
'strict' => true
自定义错误提示与操作符
支持多种比较关系,并可自定义报错信息:
[
['end_time', 'compare',
'compareAttribute' => 'start_time',
'operator' => '>=',
'message' => '结束时间不能早于开始时间'
],
[
['amount', 'compare',
'compareAttribute' => 'max_amount',
'operator' => '<=',
'message' => '申请金额不得超过最高限额'
]
常用 operator 值:
-
==(默认)、!=、>、>=、<、<= - 注意:运算符需用字符串(如
'>='),不是 PHP 的>=
对比固定值(非字段)
也可让字段与一个固定值比较,例如「确认邮箱」必须等于某个已知邮箱:
['confirm_email', 'compare',
'compareValue' => $this->email, // 动态值
'message' => '邮箱确认不正确'
]
说明:
- 用
compareValue替代compareAttribute,指定具体值(支持变量、常量、表达式) - 二者不可同时出现,只能二选一
客户端验证启用与注意事项
默认情况下 compare 验证器支持 JS 客户端校验(AJAX 提交前自动检查),前提是:
- 视图中调用了
$form->field()渲染字段(会自动注册验证规则) - 未设置
'enableClientValidation' => false - 字段名拼写与模型属性一致(区分大小写)
若发现前端没校验,检查浏览器控制台是否有 JS 报错,或确认是否开启了 yii.activeForm 脚本加载。


















