在yii2中更新表单时,避免用户名验证出现“用户名已存在”错误

时间:2019-01-10 09:33:38

标签: yii2 yii2-advanced-app

我有一个用于创建用户的表单,我将通过我们的API之一检查现有的用户名,并制定具有自定义验证功能的规则,并且其工作正常。但是在更新表单时,自定义函数也会运行并显示错误“我的用户名已存在”。

我的规则

public function rules()
{
    return [
        ['username', 'trim'],
        ['username', 'uniqueUsers'], // Find username already exists
    ]
}

我的自定义验证功能,

public function uniqueUsers($attributes, $params) 
{
    $getUser = Yii::$app->params['user']."?username=".$this->username;
    $validUsername = BaseModel::getDetails($getUser);
    $getUserValue = isset($validUsername['display']) ? $validUsername['display'] : '';
    if($getUserValue!='') {
        // echo "$attributes/";
        $this->addError($attributes, 'Username Already Exists');
    }
}

这里是我想要的,我使用了相同的用户名,该功能将无法运行,但是我再次更改,然后需要调用该功能以进行唯一检查。

3 个答案:

答案 0 :(得分:3)

您也可以使用

['username', 'unique', 'when' => function($model) {
                            return $model->isAttributeChanged('username');
                        }],

或通过@Hakeem Nofal建议

答案 1 :(得分:1)

签出yii2自己的唯一验证器

https://www.yiiframework.com/doc/api/2.0/yii-validators-uniquevalidator

// a1 needs to be unique
['a1', 'unique']

// a1 needs to be unique, but column a2 will be used to check the uniqueness of the a1 value
['a1', 'unique', 'targetAttribute' => 'a2']
// a1 and a2 need to be unique together, and they both will receive error message
[['a1', 'a2'], 'unique', 'targetAttribute' => ['a1', 'a2']]
// a1 and a2 need to be unique together, only a1 will receive error message
['a1', 'unique', 'targetAttribute' => ['a1', 'a2']]
// a1 needs to be unique by checking the uniqueness of both a2 and a3 (using a1 value)
['a1', 'unique', 'targetAttribute' => ['a2', 'a1' => 'a3']]

对于您来说,它可能看起来像

['username', 'unique', 'message' => Yii:t('app','Username Already exists')]

答案 2 :(得分:-1)

您可以通过使用场景来做到这一点;

['username', 'uniqueUsers', 'on'=>'create']

或检查模型是否是新的。

public function uniqueUsers($attributes, $params) 
{
    if ($this->isNewRecord){
        // Your validation controls
    }
}