Я пытаюсь вернуть обработанный вид с помощью 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
view:
@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, и все работает нормально. В чем может быть проблема?
Проверьте, нет ли каких-либо незаконных символов. У меня была эта проблема один раз и запущен utf8_encode в строке, и это решило проблему.
Я зашел в этот блог и подумал, что это дает неплохую идею для его исправления:
Такая ошибка убьет вас, если вы собираетесь отлаживать ее или трассируете ее шаг за шагом, вы никогда не найдете решение, потому что эта ошибка происходит в ответ, я имею в виду, что она будет обнаружена в рамках только после того, как ответ будет готов чтобы отображаться, Так что, как говорится в сообщении, «ответ логичен». Часто это происходит в представлении о том, что некоторые переменные влияют на контент ответа. Просто проверьте переменные вида один за другим и удалите каждую из них, попробуйте снова запустить. вы найдете переменную, вызывающую эту ошибку. Но прежде чем идти по этому пути, попробуйте изменить представление на любой другой странице просмотра (шаблон-клип) и посмотреть, не существует ли ошибка. если это не так, то проблема на странице просмотра.
Создайте следующую функцию
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); } } }
с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 (), «boolean».
даже при исключении переменных вида один за другим или при использовании другого представления (как было предложено WillyBurb ). Так что ответ hes не работал для меня.
После долгого исследования выяснилось, что проблема была вызвана следующими столбцами:
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 (например, 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 отличаются.