使用string时,__ toString()不得抛出异常错误

时间:2014-01-14 01:07:04

标签: php laravel

我正在使用Laravel 4进行我正在进行的项目。我需要从帖子中检索第一条评论。我使用以下代码来执行此操作。

$comments = Comment::where('post_id', $post->id)->first();

这成功检索了第一条评论(我知道这是因为print_r - 编辑$comments并且它返回了所有正确的信息。)

但是,以下代码行会触发错误__toString() must not throw an exception

<td>{{$comments->content}}</td>

当我print_r时,它返回了类型字符串,并返回了正确的字符串。那为什么它甚至会尝试将$comments->content转换为类型字符串,当它已经是一个字符串?

2 个答案:

答案 0 :(得分:7)

根据您提供的信息以及我使用Laravel的经验,我打赌导致异常的代码行您输入的行 你的问题。

<td>{{$comments->content}}</td>

此异常抱怨抛出异常的视图。如果此特定行是问题,那么您将获得有关如何将$ comments-&gt;内容转换为字符串的更具描述性的例外情况。您还已经测试过它确实是一个字符串。

我建议您查找&#34;查看&#34;对象正在回显到视图并改变它。

{{ View::make('yourbladefile')->__tostring() }}

通过提供更准确和信息丰富的例外,这对我有用。有关异常的更多信息,请查看Why it's impossible to throw exception from __toString()?

首先是什么给了我这个想法。我知道这不是一个完美的答案,所以请告诉我这是否有效,如果结果不是这样,我会更新我的答案。祝你好运。

答案 1 :(得分:0)

我知道这是一个老问题,但是对于未来的googlers(像我一样),还有另一种方法可以解决这个错误,它独立于你的框架:

public function __toString() 
{
    try {
       return (string) $this->attributeToReturn; // If it is possible, return a string value from object.
    } catch (Exception $e) {
       return get_class($this).'@'.spl_object_hash($this); // If it is not possible, return a preset string to identify instance of object, e.g.
    }
}

您可以将它与没有框架的自定义类一起使用,也可以与Symfony2 / Doctrine中的实体一起使用......它也可以使用。