Laravel错误:方法Illuminate \ View \ View :: __ toString()不得抛出异常

时间:2014-10-23 17:37:30

标签: php laravel runtime-error tostring render-to-string

你在Laravel工作时见过这个可爱的错误吗?

Method Illuminate\View\View::__toString() must not throw an exception

我已经看过了,这令人非常恼火。我发现了抛出此错误的两个原因。我只想帮助人们不要花费数小时的时间。

查看答案&以下情况。 :)

5 个答案:

答案 0 :(得分:63)

有一个非常简单的解决方案:不要将View对象转换为字符串。

不要:echo View::make('..');echo view('..');

执行:echo View::make('..')->render();echo view('..')->render();

通过转换视图,它会自动使用__toString()方法,这不会引发异常。如果您手动调用render(),则会正常处理异常。如果视图中存在错误,则会出现这种情况 - laravel会抛出异常。

这实际上是PHP限制,而不是Laravels。详细了解这个"功能"在这里:https://bugs.php.net/bug.php?id=53648

答案 1 :(得分:3)

情况1: 试图打印出数组中的值。

答案1: 尝试打印出阵列。你确定它是一个阵列吗?当它是一个对象而不是一个数组时,我得到了这个错误。尝试做一个print_r,看看你得到了什么。

情况2: 你有这样的关联数组:

Array
    (
        [post_id] => 65
        [post_text] => Multiple Images!
        [created_at] => 2014-10-23 09:16:46
        [updated_on] => 
        [post_category] => stdClass Object
            (
                [category_label] => Help Wanted
                [category_code] => help_wanted
            )

        [employee_full_name] => Sam Jones
        [employee_pic] => /images/employee-image-placeholder.png
        [employee_email] => jon@gmail.com
        [post_images] => Array
            (
                [0] => stdClass Object
                    (
                        [image_path] => 9452photo_2.JPG
                    )

                [1] => stdClass Object
                    (
                        [image_path] => 8031photo_3.JPG
                    )

            )

    )

当您尝试直接在View中访问post_images数组时,会引发错误。 否。物。什么。您。做。

答案2: 检查您呼叫视图的所有位置。这里发生的事情是我试图在我没有给出post_images数组的区域中的其他地方访问相同的视图。永远想弄清楚。

我希望这有助于其他人。 :)我只知道我一直在帮助我的错误。

答案 2 :(得分:0)

当我的案例$expression = new Expression();中的对象与参数变量submitExpression($intent, $bot_id, **$expression**){相同时,我遇到了这样的错误。

private function submitExpression($b_id, $expression){
   $expression = new Expression();
   $expression->b_id = $b_id;
   $expression->expression = $expression;
   $expression->save();

}

所以我将上面的代码更改为类似的

private function submitExpression($b_id, $statement){      
   $expression = new Expression();
   $expression->b_id = $b_id;
   $expression->expression = $statement;
   $expression->save(); 
}

一切正常,希望对您有所帮助。

答案 3 :(得分:0)

我的问题是找出在代码中确切地调用了View::__toString()的位置,以便我可以使用render()进行修复(如其他答案所示)。

要找到它,请临时编辑vendor/laravel/framework/src/Illuminate/View/View.php,并添加当前堆栈跟踪的日志记录:

public function __toString()
{
    // Next line added temporarily to debug.
    logger("This causes the '__toString() must not throw an exception' problem: " 
        . (new \Exception())->getTraceAsString());
    return $this->render();
}

答案 4 :(得分:-1)

类似的错误是:

FooController.php第0行中的FatalErrorException:方法App \ Models \ Foo :: __ toString()不能抛出异常

这只是一个糟糕的任务:$foo.= new Foo;

代替:$foo = new Foo;