Laravel 错误:方法 Illuminate\View\View::__toString() 不能抛出异常

Posted

技术标签:

【中文标题】Laravel 错误:方法 Illuminate\\View\\View::__toString() 不能抛出异常【英文标题】:Laravel Error: Method Illuminate\View\View::__toString() must not throw an exceptionLaravel 错误:方法 Illuminate\View\View::__toString() 不能抛出异常 【发布时间】:2014-12-19 11:18:09 【问题描述】:

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

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

我见过它,它非常烦人。我发现了引发此错误的两个原因。我只是想帮助人们不要花费数小时和数小时的时间。

查看下面的答案和情况。 :)

【问题讨论】:

这是一个问题吗? @Raphael_ 不抱歉!我只是想帮助人们,如果他们遇到与我相同的问题并且即将拔掉他们的头发。 :) 感谢您的帮助。我一直在寻找这方面的信息,最终谷歌把我带到了这里;) @MaximeBernard 很高兴它帮助了某人!你拿到了吗? 加油!这节省了我一些时间并给了我一些指导 【参考方案1】:

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

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

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

对于 php 版本 通过强制转换视图,它会自动使用__toString() 方法,不会抛出异常。如果手动调用render(),异常会正常处理。如果视图中有错误,就是这种情况 - laravel 会抛出异常。

在 PHP >=7.4 中已修复您应该不会遇到此问题:https://wiki.php.net/rfc/tostring_exceptions。

对于 PHP 版本 这实际上是 PHP 的限制,而不是 Laravel。在此处阅读有关此“功能”的更多信息:https://bugs.php.net/bug.php?id=53648

【讨论】:

啊。好提示! :) laravel 文档从未涵盖过这一点。 这很有帮助! 我仍然遇到同样的错误。我目前正在使用 echo view('..');但是当使用 echo view('..')->render();什么也没发生。 虽然它可能是 php 的限制,但它是 laravel 的设计。他们应该更明确地提到 ->render() 部分。这困扰了我多年。今天终于找到解决办法了,谢谢! @FranciscoOchoa 对不起,伙计,已经结婚了,否则,为什么不呢。【参考方案2】:

情况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
                    )

            )

    )

当您尝试直接在视图中访问 post_images 数组时,会引发错误。 没有。事情。什么。你。做。

答案 2: 检查您调用视图的所有位置。这里发生的事情是我试图在我没有提供 post_images 数组的区域的其他地方访问相同的视图。花了永远弄清楚。

我希望这对其他人有所帮助。 :) 我只知道我不断遇到的错误对我没有任何帮助。

【讨论】:

你说的这个数组是什么? @MaximeBernard,这只是一个例子。我已经多次收到这个错误,感觉我发布了这个。每次都是因为我试图在一个View中调用一个值,但是每次调用该视图时并没有在Controller中设置它。如此烦人的错误! 太棒了!!很高兴听您这么说! :) 我有点第二种情况,我可以访问没有 hasMany 关系的项目,但不能访问具有 hasMany 关系的项目,就像我不能回显它们一样,如果我不这样做' t 尝试它的工作原理,我 ctrl F 搜索了我的整个项目,但我只试图在一个地方制作该视图。如果我尝试回显这些元素,它会给出错误。 @JahanzebKhan,我已经看到视图中的视图以几种不同的方式完成。这是其中一种方法:***.com/questions/17227969/… 记得提交子视图所需的数据。来自父视图的数据不会进入子视图。【参考方案3】:

当我的对象$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(); 

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

【讨论】:

【参考方案4】:

我的问题是找出在我的代码中调用 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();

【讨论】:

【参考方案5】:

类似的错误是:

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

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

而不是:$foo = new Foo;

【讨论】:

非常真实!好电话! 这不是真正的解释。这里发生的情况是,您将一个类与一个变量连接起来,该变量触发 Foo 实例上的 __toString() 方法调用。如果__toString() 调用导致内部某处出现异常,您将看到此消息。

以上是关于Laravel 错误:方法 Illuminate\View\View::__toString() 不能抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

Laravel/Ardent - 在 save() 上,错误:关系方法必须返回 Illuminate 类型的对象

Laravel 5.2 单元测试错误:BadMethodCallException:调用未定义的方法 Illuminate\Database\Query\Builder::make()

如何解决 PHP 致命错误:未捕获的错误:在 laravel 版本更新时调用未定义的方法 Illuminate\Container\Container::basePath() 错误?

传递给方法的 Laravel 错误参数 1 必须是 App\Model 的实例,给定的 Illuminate\Database\Eloquent\Collection 的实例

Laravel Migration致命错误:调用未定义的方法Illuminate Database Schema Blueprint :: integer()

PHP 错误:类 'Illuminate/Foundation/Auth/Admin' [Laravel 8]