【问题标题】:The Response content must be a string or object implementing __toString(), \"boolean\" given."响应内容必须是实现 __toString() 的字符串或对象,\"boolean\" given."
【发布时间】:2014-11-19 06:29:57
【问题描述】:

我正在尝试使用 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 上进行了测试,一切正常。可能是什么问题?

【问题讨论】:

  • 您找到解决方案了吗?
  • @pc-shooter 我做过,但现在我不记得我做了什么:)
  • 如果我遇到这个问题(3次),我需要知道这是UTF-8的问题 !!
  • 我不敢相信我回到了这里,尽管我在上面留言。感谢 user2778080 提供his answer。要解决它,需要在 utf-8 字符串周围添加utf8_encode()。例如:utf8_encode("Aujourd'hui à ...")

标签: php laravel laravel-4


【解决方案1】:

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

【讨论】:

  • 这在 Laravel 中不太实用。如何在对象上运行utf8_encode
  • 谢谢!这正是我遇到的问题,这是一条非常不具描述性的错误消息。
  • 这解决了在尝试 json_encode 具有先前从命名管道读取的元素的数组时给出相同错误消息的问题!
  • @Daenu 你必须utf8_encode你的对象成员返回带有重音的字符串
【解决方案2】:

我跑到this blog post 并认为它提供了一个修复它的好主意:

如果你要调试或跟踪,这种错误会杀了你 它一步一步,你永远找不到解决方案,因为这个错误 作为响应发生,我的意思是它会被框架检测到 只有在响应准备好渲染之后,所以它就像 消息说“响应是布尔值”。往往会发生在 认为有些变量会影响响应内容。只需检查 逐个查看变量,并删除它们中的每一个尝试运行 再次 。您将找到导致此错误的变量。但之前 走这条路尝试通过任何其他视图页面更改视图 (刀片模板)并查看错误是否仍然存在。如果不是, 然后是视图页面的问题。

【讨论】:

  • 如果问题不在视图中?绝望,请帮助:来自 db 的某些数据适用于其他人不会...
  • 在我的例子中,它是一个嵌套在某处的返回 true/false,所有调用函数都返回被调用函数的输出。然而,您是说它与查询相关..您是否直接输出查询结果?如果查询为空或出错,则返回 false,这是一个布尔值。
  • 它必须是查询(超过多列),因为如果我使用`::find(id)`,一切都很好。也只是在一些记录上。
  • 那么您的模型是否允许数据库返回的所有值?
  • 您的意思是 $hidden 属性吗?是的
【解决方案3】:

创建以下函数

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);

【讨论】:

    【解决方案4】:

    在我的情况下是错误

    响应内容必须是实现 __toString() 的字符串或对象,给出“布尔值”。

    即使在逐个消除视图变量或使用另一个视图时也会出现(如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'
        );
        //...
    }
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 我刚刚修复了最烦人的错误。原来我没有将 php 文件的编码设置为 utf-8 并且在回复消息中有一些非英语字符导致了这个错误......
      【解决方案6】:

      第一:

      这个错误只发生在你return false;

      意思是Response::json($data) == false

      秒:

      json 无法编码的一些字符

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

      所以,json编码返回false

      【讨论】:

        【解决方案7】:

        虽然这个问题有点老了,你的问题现在可能已经解决了,但我认为这可能与其他人有关。 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();
        

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

          • 我做了,我只是忘了在这个例子中添加它
          猜你喜欢
          • 1970-01-01
          • 2016-05-11
          • 2012-08-20
          • 2019-03-17
          • 2015-10-24
          • 2017-08-17
          • 1970-01-01
          • 2016-04-27
          相关资源
          最近更新 更多