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

时间:2018-05-17 11:04:00

标签: yii2 yii2-validation

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

[['password', 'password_repeat'], 'required'],
['password_repeat', 'compare', 'compareAttribute' => 'password', 'message' => "Passwords don't match"],

仅当用户填写password_repeat字段时,如何为password编写规则以将其与password进行比较。如果用户跳过password,则也应跳过password_repeat的验证。

1 个答案:

答案 0 :(得分:2)

您可以使用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()创建不同表单的不同模型,例如LoginFormRegisterForm。这实际上是更干净的解决方案,并提供更多的控制。

修改

对于条件规则,您应该使用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 !== '';
            },
        ],
    ];
}