Yii2;先在 "else" 块中编码 运行,然后在 "if" 块之前编码 运行?

Yii2; code running in "else" block first, and then running code before "if" block?

我完全不知道为什么会这样,而且大约有 50% 的时间会发生这种情况。

我通过电子邮件和姓氏检查用户是否存在,如果存在,运行 一些代码。如果用户不存在,则创建用户,然后 运行 一些代码。

我已经对虚拟数据进行了各种测试,即使用户不存在,它也会首先创建它们,然后 运行s "if" 块中的代码。

这是我的。

if (User::existsByEmailAndLastName($params->email, $params->lastName)) {
    var_dump('user already exists');
} else {
    User::createNew($params);
    var_dump("Creating a new user...");
}

下面是各自的方法:

public static function existsByEmailAndLastName($email, $lastName) {
    return User::find()->where([
        'email' => $email,
    ])->andWhere([
        'last_name' => $lastName
    ])->one();
}


public static function createNew($params) {

    $user = new User;
    $user->first_name = $params->firstName;
    $user->last_name = $params->lastName;
    $user->email = $params->email;
    $user->address = $params->address;
    $user->address_2 = $params->address_2;
    $user->city = $params->city;
    $user->province = $params->province;
    $user->country = $params->country;
    $user->phone = $params->phone;
    $user->postal_code = $params->postal_code;

    return $user->insert();
}

我试过刷新缓存。我已经使用 Yii::$app->db->createCommand() 对原始 SQL 查询进行了尝试,但似乎没有任何效果。我完全被难住了。

有谁知道为什么要先创建用户,然后在 if 语句中进行检查?

使用控制器代码编辑:

public function actionComplete() 
{

    if (Yii::$app->basket->isEmpty()) {
        return $this->redirect('basket', 302);
    }

    $guest = Yii::$app->request->get('guest');
    $params = new CompletePaymentForm;
    $post = Yii::$app->request->post();

    if ($this->userInfo || $guest) {

        if ($params->load($post) && $params->validate()) {

            if (!User::isEmailValid($params->email)) {
                throw new UserException('Please provide a valid email.');
            }

            if (!User::existsByEmailAndLastName($params->email, $params->lastName)) {
                User::createNew($params);
                echo "creating new user";
            } else {
                echo "user already exists";
            }

        }

        return $this->render('complete', [
            'model' => $completeDonationForm
        ]);

    }

    return $this->render('complete-login-or-guest');
}

这是经过多次尝试后的答案:

通过 ActiveForm 小部件传递 'ajaxParam' 参数以定义在请求是 ajax 请求时将发送的 GET 参数的名称。我将我的参数命名为 "ajax"。

ActiveForm 的开头如下所示:

$form = ActiveForm::begin([
    'id' => 'complete-form',
    'ajaxParam' => 'ajax'
])

然后我在我的控制器中添加了这个检查:

if (Yii::$app->request->get('ajax') || Yii::$app->request->isAjax) {
    return false;
}

这是一个 ajax 问题,所以非常感谢 Yupik 指出我的方向(接受他的回答,因为它引导我来到这里)。

'enableAjaxValidation' => false 添加到视图中的 ActiveForm 参数。发生这种情况是因为 yii 向您的操作发送请求以验证此模型,但它未在您的 if 语句之前处理。

您可以在您的模型中进行如下验证:

public function rules() { return [ [['email'], 'functionName'], [['lastname'], 'functionforlastName'], ];}
public function functionName($attribute, $params) {
   $usercheck=User::find()->where(['email' => $email])->one();

    if($usercheck)
    {
        $this->addError($attribute, 'Email already exists!');
    }  
}

和create/apply相同的姓氏函数。

输入表单字段电子邮件和姓氏 => ['enableAjaxValidation' => true]

在控制器的创建函数中

use yii\web\Response;
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
     Yii::$app->response->format = Response::FORMAT_JSON; 
     return ActiveForm::validate($model); 
} 
else if ($model->load(Yii::$app->request->post())) 
{ 
    //place your code here 
}