忽略Yii2唯一验证程序

忽略Yii2唯一验证程序,yii2,yii2-model,yii2-validation,Yii2,Yii2 Model,Yii2 Validation,在我的RegisterPerform模型的规则()中: [ 'user_username', 'unique', 'targetClass' => 'app\models\User', 'message' => 'This username is already been taken.' ], 在我的控制器中: $model = new RegisterForm(); if ( $model->load( Yii::$app->request->post() )

在我的RegisterPerform模型的
规则()
中:

[ 'user_username', 'unique', 'targetClass' => 'app\models\User', 'message' => 'This username is already been taken.' ],
在我的控制器中:

$model = new RegisterForm();
if ( $model->load( Yii::$app->request->post() ) ) {
    if ( $user = $model->register() ) {
        return $this->redirect( [ '/login' ] );
    }
}
在注册表中执行:

public function register() {  
    $user = new User();
    $user->user_firstname = $this->user_firstname;
    $user->user_lastname = $this->user_lastname;
    $user->user_username = $this->user_username;
    $user->user_email = $this->user_email;
    $user->setPassword( $this->user_password );

    if ( !$user->validate() ) {
        return null;
    }    

    if ( $user->save() ) {
        return $user;   
    }

    return null;
}
表格:


然而,当我输入一个我知道已经存在的用户名时,错误永远不会出现,记录试图保存,尽管我得到:
完整性约束冲突:1062重复输入…


编辑:如果我将唯一规则添加到用户模型本身,那么如果我输入存在的用户名,表单将不会提交,错误不会像我怀疑的那样显示出来,您没有在客户端检查唯一的
User\u username
属性。它不起作用的原因是,您没有发送Ajax请求来检查数据库中的结果。与其他规则不同,
unique
规则需要向服务器发送额外的Ajax请求,因为如果Javascript检索所有当前注册的用户名并将其存储在客户端的某个位置,这将是一件非常糟糕的事情

要解决您的问题,请在表格中填写以下内容:

$form = ActiveForm::begin([
    'enableAjaxValidation' => true,
    'validationUrl' => [<URL HERE>],
]);
public function actionAjaxValidation()
{
    $post = Yii::$app->request->post();
    $model = new YourClass();

    if (!$model->load($post)) {
        throw new HttpException(403, 'Cannot load model');
    }

    $array = ActiveForm::validate($model);

    return json_encode($array);
}

如果你能发布你的表单代码也会很好。将表单代码添加到问题中如果这解决了你的问题,我将非常高兴你能标记为已接受:)(当然,除非有些东西工作不正常)。对不起,离开CPUIt完全没问题。只是提醒一下。:)是的,但是如果有人没有启用JS,这将失败。它不应该在服务器端处理吗?我不应该走得太远,无法尝试插入DB并获得约束错误。不幸的是,JS需要能够使用
unique
验证器。:/这实际上也适用于其他验证器(如
length
integer
,等等),因为如果禁用JS,用户即使输入了错误的数据也不会得到任何错误。只有在提交表单时,他才会看到这些错误。奇怪。文档中没有提到它。。。我发誓我以前使用过它而不必使用Ajax。。。如果您基本上是通过编写从
rules()
检索的JS/jQuery函数/事件为客户端编写自定义ValidatoryI2构建验证,那么拥有它几乎毫无意义。它被设置为默认值(因为可以禁用)。更多信息:
public function actionAjaxValidation()
{
    $post = Yii::$app->request->post();
    $model = new YourClass();

    if (!$model->load($post)) {
        throw new HttpException(403, 'Cannot load model');
    }

    $array = ActiveForm::validate($model);

    return json_encode($array);
}