Php Yii2 Ajax验证未验证唯一字段

Php Yii2 Ajax验证未验证唯一字段,php,ajax,validation,yii,yii2,Php,Ajax,Validation,Yii,Yii2,我今天在yii2 ajax验证中发现了非常奇怪的行为 基本上,我试图在表单的1个字段上执行ajax验证,以检查输入是否唯一,以及是否在该表的该字段中的任何位置都找不到输入 如果您问我以下代码应该正常工作: 在模型中: public function scenarios(){ return ['update' => ['username']]; } public function rules(){ return [['username'], 'unique']; } 在控制器中

我今天在yii2 ajax验证中发现了非常奇怪的行为

基本上,我试图在表单的1个字段上执行ajax验证,以检查输入是否唯一,以及是否在该表的该字段中的任何位置都找不到输入

如果您问我以下代码应该正常工作:

在模型中:

public function scenarios(){
   return ['update' => ['username']];
}
public function rules(){
   return [['username'], 'unique'];
}
在控制器中:

public function actionUpdate(){
    $user = User::findmodel.. bla bla
    some more bla bla..

    if(Yii::$app->request->isAjax){

        $user->setScenario('update');

        $user_post_ajax = Yii::$app->request->post('User');
        $user->username = $user_post_ajax['username'];
        Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
        return ActiveForm::validate($user);
    }

    some more bla bla bla..
}
鉴于:

    <?php $form = ActiveForm::begin(); ?>

    <?= $form->field($user, 'username', ['enableAjaxValidation' => true])->textInput() ?>
    <?= Html::submitButton('Save', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    <?php ActiveForm::end(); ?>


这应该可以工作,但它不能,它不会显示验证错误,在这种情况下类似于:
“用户名已被占用”
,它既不会显示有效也不会显示无效。它执行ajax请求,我可以在开发工具中看到json响应,但它根本不显示。但是,当您移动
$user->setScenario('update')在if条件之外,在
if(Yii::$app->request->isAjax)
之上,只有这样它才能正常工作。我不明白,我是不是错过了什么?为什么在ajax请求更改行为时使用setScenario?

您正在覆盖Yii模型中的scenarios()函数,因此没有验证任何属性

检查:

你应该做的是:

public function rules(){
  return [['username'], 'unique', 'on'=>['update']];
}

Thnx为您的答案,但这不是问题,我不希望用户名唯一仅在1个场景。正如我所说,当我将$user->setScenario('update')放入时,问题仍然存在;在if语句中,检查是否是ajax请求,它会中断,并且不会在前端显示错误。当我将其置于if检查之上时,它工作正常,并显示错误。在这两种情况下,$user->setScenario('update');是执行的,但当它在if语句中时,它会带来这个问题。我有一个小问题,我刚刚更改了表单id,这对我来说是有效的