Подтвердить что ты не робот

Содержимое ответа должно быть строкой или объектом, реализующим __toString(),\ "boolean \".

Я пытаюсь вернуть рендеринг 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'>=&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('[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, и все работает нормально. В чем может быть проблема?

4b9b3361

Ответ 1

Проверьте, нет ли каких-либо незаконных символов. У меня была эта проблема один раз и запустил utf8_encode в строке, и это решило проблему.

Ответ 2

Я столкнулся с этим сообщением в блоге и думаю, что это дает неплохую идею для его исправления:

Такая ошибка убьет вас, если вы собираетесь отлаживать ее или трассировать это шаг за шагом, вы никогда не найдете решение, потому что эта ошибка происходит в ответ, я имею в виду, что он будет обнаружен в рамках только после того, как ответ готов к оказанию, так что это message сказал, что ответ "логический". Часто это происходит в что некоторые переменные влияют на контент ответа. Просто проверьте просматривать переменные один за другим и удалять каждую из них, попробуйте запустить еще раз. вы найдете переменную, вызывающую эту ошибку. Но прежде в этом пути попытайтесь изменить представление на любой другой странице просмотра (шаблон-блейд) и посмотреть, есть ли ошибка. если это не так, то проблема на странице просмотра.

Ответ 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

Вы можете попробовать это, пожалуйста? im возвращает true или false (логическое значение), а не значение Response, подобное этому

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

Ответ 6

сначала:

эта ошибка возникает только тогда, когда вы return false;

это означает Response::json($data) == false.

секунда:

некоторый символ, который json не может кодировать

возможно, некоторый ASCII char (например, 0x00~0x31, который не может отображаться) в вашей строке...

поэтому json encode возвращает false

Ответ 7

Хотя этот вопрос немного стар, и ваша проблема, вероятно, решена к настоящему времени, я подумал, что это может быть актуально для других. 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();

При необходимости вы всегда можете вернуться к другому набору символов.

Ответ 8

Что вы не создали $data = array();, а локальные и удаленные версии PHP отличаются.