Exception handling Yii2发生异常时显示错误

Exception handling Yii2发生异常时显示错误,exception-handling,transactions,yii2,model-validation,Exception Handling,Transactions,Yii2,Model Validation,我的控制器中有以下代码: ... if (Model::validateMultiple($ttepk)) { $transaction = \Yii::$app->db->beginTransaction(); try { foreach ($ttepk as $ttep) { $ttep->save(false); if (!$ttep->assignPs()) {

我的控制器中有以下代码:

...
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;
    }
}
...
在模型中:

...
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;
    }
}
...

一切正常(如果任何模型未通过验证,则不会发生任何插入),除了我希望看到确切的错误,确切地说是哪个Ttep(每个Ttep都是一个模型)和哪个Ttepet(Ttep:Ttepet=1:N)发生了错误,以及错误是什么。现在我只看到了Exeption页面,我不知道如何使错误可见。请给我指一下正确的方向。谢谢

您可以对每个模型进行迭代,逐一验证,并在出现错误时获取错误

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;  
}
您可以通过这种方式获得错误

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

好的,那很好,但是如何包含事务呢?我的注意力集中在主函数上,但是你的问题让我找到了你的控制器代码。。然后调用已通过的loadMultiple(验证)。这样如何引发异常。。看来逻辑上有些问题。。所以我的答案是一个建议,可以得到你们在标题中提到的错误。。我认为你应该重新评估你的控制器代码,不要重复多次相同的验证我希望这对你有用我想我不会重复相同的验证。。。但我会设法实现你的想法,看看我能实现什么。谢谢!第一个是
Model::validateMultiple($ttepk)
,第二个是
Model::validateMultiple($ttepetk)
,因此对应的模型并不相同。对于事务,您可以从函数assignPs返回$errors,并根据您想要抛出的异常管理此结果