2014-09-24 14 views
22

Ich versuche, eine gerenderte Ansicht zurückzukehren Response::json verwenden, aber ich diesen Fehler.Der Antwortinhalt muss einen String oder ein Objekt sein __toString Implementierung(), „boolean “ gegeben „

The Response content must be a string or object implementing __toString(), \"boolean\" given." 

Dies ist mein Code:

$posts = Post::where(...)->orderBy(...)->get(); 
$data['posts'] = View::make("posts.partials.loadHome")->with("posts", $posts)->render(); 
$data['msg'] = "ok"; 

return Response::json($data); 

Wenn ich var_dump($data) ich diese:

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

Dies ist posts.partials.loadHome Ansicht:

@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 

Getestet habe ich diese auf localhost und alles funktioniert. Was könnte das Problem sein?

+0

Haben Sie eine Lösung dafür gefunden? –

+0

@ pc-shooter Ich habe aber jetzt weiß ich nicht mehr, was ich getan habe :) – Alen

+1

Wenn ich jemals auf dieses Problem (3 mal) fallen, muss ich wissen, dass dies ein Problem von UTF-8 ** ist! ! – Zl3n

Antwort

-1

Das haben Sie nicht erstellt $data = array(); und die lokalen und remote PHP-Versionen unterscheiden sich.

+0

Ich tat, ich habe nur vergessen, es in diesem Beispiel hinzuzufügen – Alen

13

Überprüfen Sie, ob keine unzulässigen Zeichen vorhanden sind. Ich hatte dieses Problem einmal und utf8_encode auf der Zeichenfolge ausgeführt und das Problem gelöst.

+2

Dies ist nicht sehr praktikabel in Laravel. Wie führst du 'utf8_encode' auf einem Objekt aus? –

+0

Danke dafür! Das war genau das Problem, auf das ich stieß, es ist eine sehr nicht beschreibende Fehlermeldung. – KyleT

+0

Das löste ein Problem, das die gleiche Fehlermeldung beim Versuch, ein Array mit einem zuvor von einer Named Pipe gelesenen Element zu "json_encode" zu senden, löste! – wiredolphin

10

lief ich zu this blog post in und denke, es ist es für die Befestigung eine ziemlich gute Idee gibt:

This kind of error will kill you if yo are going to debug it Or trace it step by step, you will never find the solution because this error happens in response, I mean that it will be detected by the framework only after the response is ready to be rendered ,So it is as the message said "the response is boolean". Often it will happen in the view that some variables affect the response content . Just check the view variables one by one ,and remove each of them the try to run again . you will find the variable that cause this error. But before going in this path try to change the view by any other view page (blade-template) and see if the error is still there . if it is not , then the problem in the view page.

+0

Und wenn das Problem nicht in der Ansicht ist? Verzweifelt, bitte helft: Einige Daten von db funktionieren andere nicht ... –

+0

In meinem Fall war es eine Rückgabe wahr/falsch, die irgendwo verschachtelt wurde und alle aufrufende Funktion gab die Ausgabe der aufgerufenen Funktion zurück. Aber sagst du, dass es abfragebezogen ist ... gibst du die Ergebnisse der Abfrage direkt aus? Wenn eine Abfrage leer oder falsch ist, wird ein false zurückgegeben, was ein boolescher Wert ist. – WillyBurb

+0

es muss die Abfrage sein (über mehrere Spalten) Ursache, wenn ich ':: find (id)' alles ist in Ordnung. es ist auch nur auf einigen Datensätzen. –

2

In meinem Fall der Fehler

the Response content must be a string or object implementing __toString(), "boolean" given.

auch noch apeared wenn eine Ansicht Beseitigung Variablen durch ein oder wenn eine andere Ansicht verwendet wird (wie von WillyBurb vorgeschlagen). Also antwortete er nicht für mich.

Nach langer Forschung, fand ich heraus, dass das Problem durch die folgenden Spalten verursacht wurde:

  • created_at
  • updated_at
  • deleted_at.

Nach dem Hinzufügen zu der -Eigenschaft war der Fehler verschwunden.

aus der Dokumentation:

Hiding Attributes From Array Or JSON Conversion

Sometimes you may wish to limit the attributes that are included in your model's array or JSON form, such as passwords. To do so, add a hidden property definition to your model:

class User extends Eloquent { 
    //... 
    protected $hidden = array(
     'password', 
     'remember_token', 
     'deleted_at', 
     'created_at', 
     'updated_at' 
    ); 
    //... 
} 
+0

Ja, versteckte Array löste das Problem. –

1

Sie können versuchen, diese bitte?im return true oder false (ein boolean-Wert) und kein Antwortwert wie dieser

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

Ich habe gerade den nervigsten Bug behoben. Es stellte sich heraus, dass ich die Kodierung für die PHP-Datei nicht auf utf-8 gesetzt hatte und einige nicht-englische Zeichen in der Antwort-Nachricht hatte, die diesen Fehler verursacht haben ... –

8

Erstellen Sie die folgende Funktion

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

versuchen Sie die folgenden

utf8_encode_deep($data); 
return Response::json($data); 
0
zu tun

Obwohl diese Frage schon ein bisschen alt ist und Ihr Problem wahrscheinlich inzwischen gelöst ist, dachte ich, das könnte re sein levant für andere. Tl; dr: Verwenden Sie DB::statement("SET NAMES 'UTF8'"); kurz vor dem Abrufen der Ergebnisse aus der Datenbank.

Ihre Daten werden wahrscheinlich in einem anderen Zeichensatz als UTF-8 in der Datenbank gespeichert, z. B. lantin1. Als eine Alternative zum Codieren der DB-Ergebnisse in Ihrer Anwendung könnten Sie erwägen, die Datenbank damit umgehen zu lassen.

Wenn Sie MySQL verwenden, können Sie den Zeichensatz für die Kommunikation mit dem Server unter Verwendung von SET NAMES 'charset_name' angeben. Dies gibt dem Server an, dass Abfragen unter Verwendung dieses Zeichensatzes gesendet werden, und fordert den Server auf, Ergebnisse unter Verwendung dieses Zeichensatzes zurückzugeben. (siehe documentation)

Laravel erwartet UTF-8-Daten. Also, in diesem Fall können Sie eine Erklärung bitten Ausgabe in UTF-8 vor der Auswahl Ergebnisse zu kommunizieren:

DB::statement("SET NAMES 'UTF8'"); 
$posts = Post::where(...)->orderBy(...)->get(); 

Wenn nötig, können Sie immer auf einen anderen Charakter wechseln danach eingestellt.

1

zuerst:

dieser Fehler passiert nur, wenn Sie return false;

es Response::json($data) == false bedeutet.

Sekunden:

einige Zeichen, dass json nicht

vielleicht kodieren kann, einige ASCII-Zeichen (wie 0x00~0x31, die nicht angezeigt werden können) in der Zeichenfolge ...

so, json kodieren return false

Verwandte Themen