比较Validator只验证一个yii2

Compare Validator validates only one yii2

我在 yii2 表单中使用 compareValidator

这是代码

[['passwordConfirm'], 'compare', 'compareAttribute' => 'password'],

它应该可以正常工作,因为它也是文档中的代码

但是发生的事情是它只验证密码一次。

例如,如果我输入 密码 确认密码 一旦它验证正常但如果我回到 password 字段并更改密码而不是比较 confirm password input 与新 password input

还有其他人遇到同样的问题吗??? 或者我这里也做错了

这是model代码

 public function rules()
{
    return [
        ['username', 'filter', 'filter' => 'trim'],
        ['username', 'required'],  
        ['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This username has already been taken.'],
        ['username', 'string', 'min' => 2, 'max' => 255],

        ['email', 'filter', 'filter' => 'trim'],
        ['email', 'required'],
        ['email', 'email'],
        ['email', 'string', 'max' => 255],
        ['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This email address has already been taken.'],

        ['password', 'required'],
        ['password', 'string', 'min' => 6],

        [['passwordConfirm'], 'compare', 'compareAttribute' => 'password'],

    ];
}

public function attributeLabels()
{
    return [
        'passwordConfirm' => 'Confirm Password',
        'username' => 'Username',
        'email' => 'Email',
    ];
}

这里是 view 代码

    <?php $form = ActiveForm::begin(['options'=>['enctype'=>'multipart/form-data']]); ?>

        <?= $form->field($model, 'username')->textInput( ['data-toggle' => 'tooltip',
            'data-placement' =>
                'right',
            'title' => 'Username should contain at least 6 characters'
        ]) ?>

        <?= $form->field($model, 'password')->passwordInput(['data-toggle' => 'tooltip',
            'data-placement' =>
                'right',
            'title' => 'Password should contain at least 6 characters',

        ]) ?>

        <?= $form->field($model, 'passwordConfirm')->passwordInput() ?>

        <?= $form->field($model, 'email') ?>

    <?php ActiveForm::end(); ?>

谢谢

这是预期的行为。验证器附加到 passwordConfirm 属性,因此在该属性更改时触发。具体操作取决于如何设置 ActiveFieldvalidateOnChangevalidateOnBlurvalidateOnType 属性。

但是,整个表单在提交之前应该重新验证,因此如果您返回并更改 password 字段,您将看到错误。

如果您确实需要在您描述的场景中启用验证,您可以将另一个 compare 验证器添加到后端的 password 属性,或者添加一个调用来验证 passwordCompare当您的 password 字段在前端更改时的属性。

不过我建议您坚持原来的实现方式,因为表单最终会得到验证,如果不是在前端,那么在后端。