【问题标题】:Yii2 delete ActiveRecord error message sometimes array, sometimes not?Yii2删除ActiveRecord错误信息有时是数组,有时不是?
【发布时间】:2018-06-20 09:37:07
【问题描述】:

我在 Controller 中有这个,用 giiant 生成的(我认为它是正确的):

public function actionDelete($id) {
    try {
        $this->findModel($id)->delete();
    } catch (\Exception $e) {
        $msg = (isset($e->errorInfo[2])) ? $e->errorInfo[2] : $e->getMessage();
        \Yii::$app->getSession()->addFlash('deleteError', $msg);
        return $this->redirect(Url::previous());
    }

    $isPivot = strstr('$id', ',');
    if ($isPivot == true) {
        return $this->redirect(Url::previous());
    } elseif (isset(\Yii::$app->session['__crudReturnUrl']) && \Yii::$app->session['__crudReturnUrl'] != '/') {
        Url::remember(null);
        $url = \Yii::$app->session['__crudReturnUrl'];
        \Yii::$app->session['__crudReturnUrl'] = null;

        return $this->redirect($url);
    } else {
        return $this->redirect(['index']);
    }
}

现在我的问题是,它有时会抛出 $msg 作为数组,我不知道为什么。

查看/索引:

if (\Yii::$app->session->getFlash('deleteError') !== null) {
    echo Alert::widget([
        'options' => ['class' => 'alert-danger'],
        'body' => \Yii::$app->session->getFlash('deleteError'),
    ])
;}

错误信息:

PHP 通知 – yii\base\ErrorException

数组到字符串的转换

我不知道为什么它有时是数组,有时不是。所有控制器都是相同的,但对于某些模型它可以工作,而对于某些模型则不能。我可以实现if is_array then ...[0] otherwise ... 的解决方法,但我觉得这不是解决问题的正确方法。模型如何更改此错误消息的数据类型?你能指出我正确的方向吗?非常感谢。

【问题讨论】:

  • 您能否向我们展示您遇到的错误示例?
  • 你能不能展示一下findModel() 函数是什么样的,或者它是GII默认生成的函数

标签: php activerecord error-handling yii2 delete-row


【解决方案1】:

首先,您实际上从未在这里使用模型验证,因此它与模型无关。其次,$msg 可能没问题,问题是你如何使用getFlash()。此方法可能返回数组,这是预期并记录在案的:

如果使用了 addFlash,则为 flash 消息或消息数组。

您应该遍历getFlash() 结果以获取字符串形式的实际消息,或者使用小部件来处理此问题并从getFlash() 结果生成多个警报。

您也可以使用setFlash() 代替addFlash()。但我不建议这样做 - 它很容易覆盖以前的一些闪烁,并且您不应盲目假设 getFlash() 结果将是一个字符串。

【讨论】:

  • 还是不行。没有实现 addFlash 的真正解决方案。数组中的一条简单删除错误消息没有任何意义......我不明白。也许这不太好:$msg = (isset($e->errorInfo[2])) ? $e->errorInfo[2] : $e->getMessage();
  • 我已将所有删除操作更改为使用 setflash 而不是 addflash,这是我使其工作的唯一方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 2017-11-17
相关资源
最近更新 更多