Yii2 中可通过 rules() 方法注册自定义验证方法,如 ['password', 'validatePasswordStrength'],该方法需为 public 并调用 addError() 报错;支持 on 场景、when 条件触发,且可访问模型属性、数据库或外部服务。

在 Yii2 中,可以通过在模型的 rules() 方法中使用 ['attribute', 'functionName'] 语法,调用类中的自定义方法完成验证逻辑。这种方式灵活、可读性强,适合封装复杂或业务相关的校验规则。
定义验证方法
在模型类(如 UserForm)中,声明一个 public 方法,方法名即为规则中指定的函数名。该方法接收一个参数(通常是 $attribute),内部通过 $this->addError() 添加错误信息:
public function validatePasswordStrength($attribute)
{
$password = $this->password;
if (strlen($password) < 8) {
$this->addError($attribute, '密码长度不能少于8位');
}
if (!preg_match('/[A-Z]/', $password)) {
$this->addError($attribute, '密码必须包含至少一个大写字母');
}
}
在 rules() 中注册该验证
将自定义方法名作为验证器传入规则数组,注意保持方法名与定义一致,并确保方法是 public 的:
public function rules()
{
return [
// ... 其他规则
['password', 'validatePasswordStrength'],
// 支持多个属性共用同一验证方法
[['username', 'email'], 'validateUniqueAcrossTables'],
];
}
支持场景和条件验证
可在规则中添加 on 或 when 参数,控制验证触发时机:
-
按场景触发:仅在
'create'场景下执行验证['password', 'validatePasswordStrength', 'on' => 'create'] -
按条件触发:例如仅当确认密码不为空时才校验强度
['password', 'validatePasswordStrength', 'when' => function ($model) { return !empty($model->password); }]
验证方法中访问其他属性或服务
自定义方法内可自由访问模型任意属性、调用其他方法,甚至注入外部服务(如通过依赖注入或 Yii::$app 获取):
- 检查两个字段是否一致:
if ($this->password !== $this->password_repeat) - 查询数据库判断唯一性:
User::find()->where(['email' => $this->email])->exists() - 调用外部 API 校验手机号格式或实名信息


















