Yii2 表单验证 - 仅在填写密码字段时比较密码重复
Yii2 form validation - compare password repeat only when password field is filled
我的表单验证使用以下规则:
[['password', 'password_repeat'], 'required'],
['password_repeat', 'compare', 'compareAttribute' => 'password', 'message' => "Passwords don't match"],
如何为 password_repeat
编写规则,以便仅在用户填写 password
字段时将其与 password
进行比较。如果用户跳过 password
,也应跳过 password_repeat
的验证。
你可以使用 scenarios:
public function rules() {
return [
[['username', 'password'], 'required', 'on' => self::SCENARIO_LOGIN],
[['username', 'password', 'password_repeat'], 'required', 'on' => self::SCENARIO_REGISTER],
[
'password_repeat', 'compare', 'compareAttribute' => 'password',
'message' => "Passwords don't match", 'on' => self::SCENARIO_REGISTER,
],
];
}
这允许您为不同的表单设置不同的规则(登录和注册时需要不同的字段)。
您也可以考虑使用自己的 rules()
为不同的表单创建不同的模型,例如 LoginForm
和 RegisterForm
。这实际上是更干净的解决方案并提供更多控制。
编辑
对于条件规则,您应该使用 when
属性:
public function rules() {
return [
[['password', 'password_repeat'], 'string'],
[
'password_repeat', 'compare', 'compareAttribute' => 'password',
'message' => "Passwords don't match", 'skipOnEmpty' => false,
'when' => function ($model) {
return $model->password !== null && $model->password !== '';
},
],
];
}
我的表单验证使用以下规则:
[['password', 'password_repeat'], 'required'],
['password_repeat', 'compare', 'compareAttribute' => 'password', 'message' => "Passwords don't match"],
如何为 password_repeat
编写规则,以便仅在用户填写 password
字段时将其与 password
进行比较。如果用户跳过 password
,也应跳过 password_repeat
的验证。
你可以使用 scenarios:
public function rules() {
return [
[['username', 'password'], 'required', 'on' => self::SCENARIO_LOGIN],
[['username', 'password', 'password_repeat'], 'required', 'on' => self::SCENARIO_REGISTER],
[
'password_repeat', 'compare', 'compareAttribute' => 'password',
'message' => "Passwords don't match", 'on' => self::SCENARIO_REGISTER,
],
];
}
这允许您为不同的表单设置不同的规则(登录和注册时需要不同的字段)。
您也可以考虑使用自己的 rules()
为不同的表单创建不同的模型,例如 LoginForm
和 RegisterForm
。这实际上是更干净的解决方案并提供更多控制。
编辑
对于条件规则,您应该使用 when
属性:
public function rules() {
return [
[['password', 'password_repeat'], 'string'],
[
'password_repeat', 'compare', 'compareAttribute' => 'password',
'message' => "Passwords don't match", 'skipOnEmpty' => false,
'when' => function ($model) {
return $model->password !== null && $model->password !== '';
},
],
];
}