Yii2表单验证-仅在填写密码字段时比较密码重复

Yii2表单验证-仅在填写密码字段时比较密码重复,yii2,yii2-validation,Yii2,Yii2 Validation,我的表单验证使用以下规则: [['password', 'password_repeat'], 'required'], ['password_repeat', 'compare', 'compareAttribute' => 'password', 'message' => "Passwords don't match"], 如何为password\u repeat编写规则,以便仅当用户填写password字段时将其与password进行比较。如果用户跳过密码,也应跳过对密码\u

我的表单验证使用以下规则:

[['password', 'password_repeat'], 'required'],
['password_repeat', 'compare', 'compareAttribute' => 'password', 'message' => "Passwords don't match"],
如何为
password\u repeat
编写规则,以便仅当用户填写
password
字段时将其与
password
进行比较。如果用户跳过
密码
,也应跳过对
密码\u repeat
的验证。

您可以使用:

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,
        ],
    ];
}
这允许您为不同的表单设置不同的规则(登录和注册时需要不同的字段)

您还可以考虑用自己的<代码>规则()/<代码>创建不同的模型,如<代码> Logiele> <代码>和<代码>注册窗体< /代码>。这实际上是一种更干净的解决方案,可以提供更多的控制


编辑

对于条件规则,应使用属性:

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 !== '';
            },
        ],
    ];
}

密码和密码重复是用户配置文件设置的一部分,如果用户想更改密码,请输入密码并重复此设置,否则,请跳过PaaWord和密码重复,我只想用户插入密码,请检查密码重复字段。我使用了您的代码,但当用户插入密码重复时,请比较两个字段,当用户插入密码和跳过密码\u repeat时,不要比较这两个字段,我甚至使用自定义函数进行验证,但它在密码\u repeat不为空时也有效!