Ответ 1
Проверьте, нет ли каких-либо незаконных символов. У меня была эта проблема один раз и запустил utf8_encode в строке, и это решило проблему.
Я пытаюсь вернуть рендеринг View с помощью 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('[email protected]', $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('[email protected]', $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('[email protected]', $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, и все работает нормально. В чем может быть проблема?
Проверьте, нет ли каких-либо незаконных символов. У меня была эта проблема один раз и запустил utf8_encode в строке, и это решило проблему.
Я столкнулся с этим сообщением в блоге и думаю, что это дает неплохую идею для его исправления:
Такая ошибка убьет вас, если вы собираетесь отлаживать ее или трассировать это шаг за шагом, вы никогда не найдете решение, потому что эта ошибка происходит в ответ, я имею в виду, что он будет обнаружен в рамках только после того, как ответ готов к оказанию, так что это message сказал, что ответ "логический". Часто это происходит в что некоторые переменные влияют на контент ответа. Просто проверьте просматривать переменные один за другим и удалять каждую из них, попробуйте запустить еще раз. вы найдете переменную, вызывающую эту ошибку. Но прежде в этом пути попытайтесь изменить представление на любой другой странице просмотра (шаблон-блейд) и посмотреть, есть ли ошибка. если это не так, то проблема на странице просмотра.
Создать следующую функцию
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);
В моем случае ошибка
содержимое Ответа должно быть строкой или объектом, реализующим __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'
);
//...
}
Вы можете попробовать это, пожалуйста? im возвращает true или false (логическое значение), а не значение Response, подобное этому
return Response::json(array(
'error' => false,
'message' => 'Valid Pincode'),
200
);
эта ошибка возникает только тогда, когда вы return false;
это означает Response::json($data) == false
.
некоторый символ, который json не может кодировать
возможно, некоторый ASCII char (например, 0x00~0x31
, который не может отображаться) в вашей строке...
поэтому json encode возвращает false
Хотя этот вопрос немного стар, и ваша проблема, вероятно, решена к настоящему времени, я подумал, что это может быть актуально для других. Tl; dr: используйте DB::statement("SET NAMES 'UTF8'");
непосредственно перед извлечением результатов из базы данных.
Ваши данные, вероятно, хранятся в наборе символов, отличном от UTF-8 в базе данных, например lantin1. В качестве альтернативы для кодирования результатов DB в вашем приложении вы можете подумать о том, чтобы позволить DB обрабатывать это.
При использовании MySQL вы можете указать набор символов для связи с сервером с помощью SET NAMES 'charset_name'
. Это указывает серверу, что запросы отправляются с использованием этого набора символов, и просит сервер возвращать результаты с помощью этого набора символов. (см. документация)
Laravel ожидает данные UTF-8. Таким образом, в этом случае вы можете выдать выражение с просьбой об обмене данными в UTF-8 перед выбором результатов:
DB::statement("SET NAMES 'UTF8'");
$posts = Post::where( ... )->orderBy( ... )->get();
При необходимости вы всегда можете вернуться к другому набору символов.
Что вы не создали $data = array();
, а локальные и удаленные версии PHP отличаются.