我尝试使用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'>=></font> <small>string</small> <font color='#cc0000'>'<div class="post postGrid" data-id="1864"> <a target='_blank' href="http://objavi.net/posts/1864"><img src="http://objavi.net/" id="imgWrap" data-original="/thumbs/YAo4wFzIpl76.jpg" class="lazy" alt="Deset manje poznatih činjenica o Jozefu Staljinu"></a> <div id="bodyPreview"> <a target='_blank' href="http://objavi.net/posts/1864"><h1 class="previewTitle">Deset manje poznatih činjenica o Jozefu Staljinu</h1></a> <h3 id="postInfo"> <a class="paint" href="/category/17">zanimljivosti</a> '...</font> <i>(length=12172)</i>
'msg' <font color='#888a85'>=></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上测试了这一点,一切正常。可能是什么问题?
答案 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版本不同。