Search code examples
exceptiontransactionsyii2model-validation

Yii2 show error when exception occurs


I have this code in my controller:

...
if (Model::validateMultiple($ttepk)) {
    $transaction = \Yii::$app->db->beginTransaction();
    try {
        foreach ($ttepk as $ttep) {
            $ttep->save(false);
            if (!$ttep->assignPs()) {
                throw new UserException('assignPs failed');
            }
        }
        $transaction->commit();
        return $this->redirect(['index']);
    } catch (Exception $ex) {
        $transaction->rollBack();
        throw $ex;
    }
}
...

in model:

...
public function assignPs() {
    foreach (...) {
        $ttepetk[...] = new Ttepet;
        $ttepetk[...]->ttepId = $this->id;
        ... // set other attributes
        }
    }

    if (Model::validateMultiple($ttepetk)) {
        foreach ($ttepetk as $ttepet) {
            $ttepet->save(false);
        }
        return true;
    } else {
        return false;
    }
}
...

Everything is working fine (no inserts are happening if any of the models fail validation), except that I would like to see the exact error, exactly by which Ttep (each Ttep is a model) and by which Ttepet (Ttep:Ttepet = 1:N) has the error happened, and what was that. Now I see the Exeption page only, and I don't know how to make the errors visible. Please point me to the right direction. Thanks!


Solution

  • You could iterate on each single model validating one by one and getting the errors when occurs ...

    if (Model::validateMultiple($ttepetk)) {
        foreach ($ttepetk as $ttepet) {
            $ttepet->save(false);
        }
        return true;
    } else {
      foreach($ttepetk as $model){
          if ($model->validate()) {
            // all inputs are valid
        } else {
          // validation failed: $errors is an array containing error messages
          $errors = $model->errors;
        }
      }
        return $errors;  
    }
    

    you can get the errors this way

      $myErrorResult = $ttep->assignPs();
      if (!$myErrorResult) {
              ......