Response内容必须是实现__toString()的字符串或对象,\" boolean \"给定&#34。

时间:2014-09-24 16:51:39

标签: php laravel laravel-4

我尝试使用Response::json返回呈现的视图但我收到此错误:

The Response content must be a string or object implementing __toString(), \"boolean\" given."

这是我的代码:

$posts = Post::where( ... )->orderBy( ... )->get();
$data['posts'] = View::make("posts.partials.loadHome")->with("posts", $posts)->render();
$data['msg'] = "ok";

return Response::json($data);

如果我var_dump($data)我明白了:

<pre class='xdebug-var-dump' dir='ltr'>
<b>array</b> <i>(size=2)</i>
  'posts' <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'&lt;div class=&quot;post postGrid&quot; data-id=&quot;1864&quot;&gt;&#10; &lt;a target=&#39;_blank&#39; href=&quot;http://objavi.net/posts/1864&quot;&gt;&lt;img src=&quot;http://objavi.net/&quot; id=&quot;imgWrap&quot; data-original=&quot;/thumbs/YAo4wFzIpl76.jpg&quot; class=&quot;lazy&quot; alt=&quot;Deset manje poznatih činjenica o Jozefu Staljinu&quot;&gt;&lt;/a&gt;&#10;  &#10;   &lt;div id=&quot;bodyPreview&quot;&gt;&#10;     &#10;       &lt;a target=&#39;_blank&#39; href=&quot;http://objavi.net/posts/1864&quot;&gt;&lt;h1 class=&quot;previewTitle&quot;&gt;Deset manje poznatih činjenica o Jozefu Staljinu&lt;/h1&gt;&lt;/a&gt;&#10;&#10;     &lt;h3 id=&quot;postInfo&quot;&gt;&#10;                         &lt;a class=&quot;paint&quot; href=&quot;/category/17&quot;&gt;zanimljivosti&lt;/a&gt;&#10; '...</font> <i>(length=12172)</i>
  'msg' <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'ok'</font> <i>(length=2)</i>
</pre>

这是posts.partials.loadHome视图:

@foreach($posts as $post)

<div class="post postGrid" data-id="{{ $post->id }}">
    <a target='_blank' href="{{ URL::action('PostsController@show', $post->id) }}">{{ HTML::image(null, $post->title, ["id" => "imgWrap", "data-original" => $post->getThumb(), "class" => "lazy"]) }}</a>

    <div id="bodyPreview">

        <a target='_blank' href="{{ URL::action('PostsController@show', $post->id) }}"><h1 class="previewTitle">{{ e($post->title) }}</h1></a>

        <h3 id="postInfo">
            @foreach($post->categories as $c)
                <a class="paint" href="/category/{{ $c->id }}">{{ $c->name }}</a>
            @endforeach
        </h3>

        <h2 class="bodyPreview">{{ strip_tags(truncString($post->body, 160)) }}</h2>

        <div id="createdBy">
            <a href="{{ URL::action('UsersController@show', $post->user()->first()->id) }}">
                {{ HTML::image($post->user()->first()->getAvatar(), $post->user()->first()->username, ["width" => "32", "height" => "32"]) }}

                {{{ $post->user()->first()->username }}}
            </a>
            <label id="timeAgo">{{ localDate($post->created_at); }}</label>
        </div>
    </div>
</div>
@endforeach

我在localhost上测试了这一点,一切正常。可能是什么问题?

8 个答案:

答案 0 :(得分:15)

检查以确保没有任何非法字符。我曾经遇到过这个问题,并在字符串上运行了utf8_encode,解决了这个问题。

答案 1 :(得分:12)

我跑到this blog post并认为它给了一个很好的想法来修复它:

  

如果您要调试它或跟踪,这种错误会杀了你   它一步一步,你将永远找不到解决方案,因为这个错误   发生在回应中,我的意思是它将被框架检测到   只有在准备好呈现响应之后,才会如此   消息说&#34;响应是boolean&#34;。通常它会发生在   查看某些变量会影响响应内容。检查一下   逐个查看变量,并删除每个尝试运行   再次。你会发现导致这个错误的变量。但之前   进入此路径尝试通过任何其他视图页面更改视图   (刀片模板)并查看错误是否仍然存在。如果不是,   然后是视图页面中的问题。

答案 2 :(得分:8)

创建以下功能

function utf8_encode_deep(&$input) {
    if (is_string($input)) {
        $input = utf8_encode($input);
    } else if (is_array($input)) {
        foreach ($input as &$value) {
            self::utf8_encode_deep($value);
        }

        unset($value);
    } else if (is_object($input)) {
        $vars = array_keys(get_object_vars($input));

        foreach ($vars as $var) {
            self::utf8_encode_deep($input->$var);
        }
    }
}

尝试执行以下操作

utf8_encode_deep($data);
return Response::json($data);

答案 3 :(得分:2)

在我的情况下错误

  

Response内容必须是实现__toString()的字符串或对象,给定“boolean”。

甚至在逐个消除视图变量或使用另一个视图时也是如此(如WillyBurb所述)。所以他的答案对我不起作用。

经过长时间的研究,我发现问题是由以下列引起的:

  • created_at
  • updated_at
  • deleted_at

将它们添加到$hidden属性后,错误消失了。

来自文档:

  

隐藏数组或JSON转换的属性

     

有时您可能希望限制模型数组或JSON表单中包含的属性,例如密码。为此,请向模型添加隐藏属性定义:

class User extends Eloquent {
    //...
    protected $hidden = array(
        'password',
        'remember_token',
        'deleted_at',
        'created_at',
        'updated_at'
    );
    //...
}

答案 4 :(得分:1)

你可以试试吗?我返回true或false(一个布尔值),而不是像这样的响应值

return Response::json(array(
        'error' => false,
        'message' => 'Valid Pincode'),
        200
    );

答案 5 :(得分:1)

首先:

此错误仅在您return false;

时发生

表示Response::json($data) == false

第二名:

json无法编码的某些字符

也许,你的字符串中有一些ASCII字符(如0x00~0x31无法显示)......

所以,json编码返回false

答案 6 :(得分:0)

虽然这个问题有点陈旧,你的问题现在可能已经解决了,但我认为这可能与其他人有关。 Tl; dr:在从数据库中检索结果之前使用DB::statement("SET NAMES 'UTF8'");

您的数据可能存储在数据库中UTF-8以外的字符集中,例如lantin1。作为在应用程序中编码DB结果的替代方法,您可以考虑让DB处理此问题。

使用MySQL时,您可以使用SET NAMES 'charset_name'指定要与服务器通信的字符集。这指定服务器使用此字符集发送查询,并要求服务器使用此字符集返回结果。 (见documentation

Laravel期待UTF-8数据。因此,在这种情况下,您可以发出声明,要求在选择结果之前以UTF-8进行通信:

DB::statement("SET NAMES 'UTF8'");
$posts = Post::where( ... )->orderBy( ... )->get();

如有必要,您可以随后切换回另一个字符集。

答案 7 :(得分:-1)

你没有创建$data = array();,本地和远程PHP版本不同。