Yii2自定义密码验证规则有三种方式:1.内联函数(如validatePasswordStrength方法)用于简单逻辑;2.封装独立验证器类(如PasswordValidator)支持复用与配置;3.结合scenario实现多场景差异化校验,并可用compare验证两次输入一致性。

在 Yii2 中自定义密码验证规则,核心是创建一个可复用、语义清晰、支持多场景的验证方法,既可作为模型规则中的内联验证器,也可封装为独立的验证类。下面给出几种常用且实用的写法。
使用内联验证函数(适合简单逻辑)
在模型中直接定义匿名函数或普通方法,配合 rules() 使用:
- 在模型类中添加一个名为
validatePasswordStrength的公共方法 - 该方法接收两个参数:
$attribute(当前字段名,如'password')和$params(额外配置) - 通过
$this->addError()添加错误提示
示例代码:
public function rules()
{
return [
['password', 'validatePasswordStrength'],
// 其他规则...
];
}
public function validatePasswordStrength($attribute, $params)
{
$value = $this->$attribute;
if (strlen($value) addError($attribute, '密码长度不能少于 8 位');
}
if (!preg_match('/[A-Z]/', $value)) {
$this->addError($attribute, '密码必须包含至少一个大写字母');
}
if (!preg_match('/[a-z]/', $value)) {
$this->addError($attribute, '密码必须包含至少一个小写字母');
}
if (!preg_match('/[0-9]/', $value)) {
$this->addError($attribute, '密码必须包含至少一个数字');
}
if (!preg_match('/[^A-Za-z0-9]/', $value)) {
$this->addError($attribute, '密码必须包含至少一个特殊字符');
}
}
封装为独立验证器类(推荐用于复用或复杂逻辑)
新建文件 common/validators/PasswordValidator.php,继承 \yii\validators\Validator:
- 重写
validateAttribute()方法实现校验逻辑 - 支持配置最小长度、是否强制大小写、数字、特殊字符等选项
- 便于在多个模型中统一调用,也方便单元测试
示例:
namespace common\validators;
use yii\validators\Validator;
class PasswordValidator extends Validator
{
public $minLength = 8;
public $requireUppercase = true;
public $requireLowercase = true;
public $requireDigit = true;
public $requireSpecial = true;
public function validateAttribute($model, $attribute)
{
$value = $model->$attribute;
$errors = [];
if (strlen($value) minLength) {
$errors[] = "密码长度不能少于 {$this->minLength} 位";
}
if ($this->requireUppercase && !preg_match('/[A-Z]/', $value)) {
$errors[] = '密码必须包含至少一个大写字母';
}
if ($this->requireLowercase && !preg_match('/[a-z]/', $value)) {
$errors[] = '密码必须包含至少一个小写字母';
}
if ($this->requireDigit && !preg_match('/[0-9]/', $value)) {
$errors[] = '密码必须包含至少一个数字';
}
if ($this->requireSpecial && !preg_match('/[^A-Za-z0-9]/', $value)) {
$errors[] = '密码必须包含至少一个特殊字符';
}
foreach ($errors as $error) {
$model->addError($attribute, $error);
}
}
}
然后在模型中使用:
public function rules()
{
return [
['password', common\validators\PasswordValidator::class],
// 或带参数:
['password', common\validators\PasswordValidator::class,
'minLength' => 10,
'requireSpecial' => false
],
];
}
结合场景(scenario)做差异化校验
例如注册时要求强密码,修改密码时允许沿用旧规则,可通过 on 指定场景:
- 在
rules()中用'on' => ['register']控制生效场景 - 模型中设置
$scenario,如$model->scenario = 'register';
示例:
public function rules()
{
return [
['password', common\validators\PasswordValidator::class, 'on' => 'register'],
['password', 'string', 'min' => 6, 'on' => 'reset'],
];
}
验证两次输入是否一致(如 password 和 password_repeat)
Yii2 内置了 compare 验证器,无需手写:
public function rules()
{
return [
['password', 'required'],
['password_repeat', 'required'],
['password_repeat', 'compare', 'compareAttribute' => 'password', 'message' => '两次输入的密码不一致'],
];
}
若需更灵活控制(比如仅在特定场景下比较),可搭配 on 或自定义逻辑。











