首页 > 解决方案 > Yii2:独立验证不触发客户端验证

问题描述

验证功能不起作用。验证海关规则不适用于该usernmane字段

module dektrium/user
PHP 7.1
Yii 2.0.16

已经从这里尝试了所有:https ://www.yiiframework.com/doc/guide/2.0/en/input-validation (内联验证器和独立验证器)

模型代理:

class Agent extends Profile
{
    public $username;
    public $password;
    public $password2;

    public function rules()
    {
        $rules = [
            ['username', AgentValidator::className()],// it's not work
            [['email'], 'email'], // it's work
            ['password2', 'compare', 'compareAttribute' => 'password', 'message' => 'Пароли должны совпадать'],//// it's work
        ];
        return array_merge(parent::rules(), $rules);
    }

}

代理验证器.php

<?php
namespace app\components;
use yii\validators\Validator;

class AgentValidator extends  Validator
{
    public function validateAttribute($model, $attribute)
    {
      if (User::findOne(['username' => $this->$attribute]]) {
            $this->addError($attribute, 'Такой логин уже занят');

        }
    }
}

标签: validationyii2

解决方案


您正在使用独立验证器,并且您希望前端验证与后端一起工作,因此您需要覆盖yii\validators\Validator::clientValidateAttribute()独立验证器中的AgentValidator,它返回一段在客户端执行验证的 JavaScript 代码。

在 JavaScript 代码中,您可以使用以下预定义变量:

  • attribute:正在验证的属性的名称。
  • value: 被验证的值。
  • messages:用于保存属性验证错误消息的数组。
  • deferred:可以将延迟对象推入的数组。

您可以通过实施客户端验证部分详细阅读。

除了上面列出的所有内容之外,您的验证器代码中存在错误User::findOne(['username' => $this->$attribute]],您需要使用$model->$attribute而不是$this->$attribute永远不会获得表单中输入的确切值。您可能错误地从模型中添加了它。

您当前的验证器应如下所示

<?php
namespace app\components;
use yii\validators\Validator;

class AgentValidator extends  Validator
{
    public $message='Такой логин уже занят';

    public function validateAttribute($model, $attribute)
    {
        if (User::findOne(['username' => $model->$attribute])!==null) 
        {
            $model->addError($attribute, $this->message);
        }
    }

    public function clientValidateAttribute($model, $attribute, $view) {
        //check if user exists
        $userExists = User::findOne(['username' => $model->$attribute])!==null;

        $message = json_encode($this->message, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);

        return <<<JS
            if($userExists){
                messages.push($message);
                return;
            }
JS;
    }
}

推荐阅读