webentwicklung-frage-antwort-db.com.de

Der Antwortinhalt muss eine Zeichenfolge oder ein Objekt sein, das __toString () implementiert, wobei "boolean" angegeben ist.

Ich versuche, eine gerenderte Ansicht mit Response::json zurückzugeben, erhalte jedoch diese Fehlermeldung:

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

Das 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) bekomme ich folgendes

<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

Ich habe das auf localhost getestet und alles funktioniert gut. Was könnte das Problem sein?

22
Alen

Stellen Sie sicher, dass keine illegalen Zeichen vorhanden sind. Ich hatte dieses Problem einmal und lief utf8_encode für die Zeichenfolge und das Problem wurde behoben.

15
user2778080

Ich bin zu diesem Blogpost gelaufen und denke, es gibt eine ziemlich gute Idee, um es zu beheben: 

Diese Art von Fehler wird Sie töten, wenn Sie es debuggen oder verfolgen Wenn Sie Schritt für Schritt die Lösung finden, wird dieser Fehler nicht gefunden geschieht als Antwort, ich meine, dass es vom Framework erkannt wird erst nachdem die Antwort gerendert werden kann, ist es wie Nachricht sagte "Die Antwort ist boolean". Oft geschieht dies in der Ansicht, dass einige Variablen den Antwortinhalt beeinflussen. Überprüfen Sie einfach die Sehen Sie sich die Variablen einzeln an und entfernen Sie sie, um sie auszuführen nochmal . Sie finden die Variable, die diesen Fehler verursacht. Aber vorher In diesem Pfad versuchen Sie, die Ansicht auf jeder anderen Ansichtsseite zu ändern (Blade-Vorlage) und sehen, ob der Fehler noch vorhanden ist. wenn es das nicht ist , dann das problem auf der ansicht seite.

12
WillyBurb

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

Versuche folgendes zu tun

utf8_encode_deep($data);
return Response::json($data);

In meinem Fall der Fehler 

der Response-Inhalt muss ein String oder ein Objekt sein, das __toString (), "boolean", implementiert.

erschien auch, wenn Ansichtsvariablen nacheinander beseitigt werden oder wenn eine andere Ansicht verwendet wird (wie von WillyBurb vorgeschlagen). Seine Antwort hat also nicht für mich funktioniert. 

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

  • created_at 
  • updated_at
  • deleted_at.

Nach dem Hinzufügen zur $hidden-Eigenschaft war der Fehler nicht mehr vorhanden.

aus den docs:

Ausblenden von Attributen vor Array- oder JSON-Konvertierung

In manchen Fällen möchten Sie möglicherweise die Attribute einschränken, die im Array oder JSON-Formular Ihres Modells enthalten sind, beispielsweise Kennwörter. Fügen Sie dazu Ihrem Modell eine ausgeblendete Eigenschaftsdefinition hinzu:

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

Sie können dies bitte versuchen? Im gibt true oder false (einen booleschen Wert) zurück und nicht einen solchen Antwortwert

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

zuerst :

dieser Fehler ist nur aufgetreten, wenn Sie return false;

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

zweite :

ein zeichen, das json nicht kodieren kann 

vielleicht , etwas ASCII Zeichen (wie 0x00~0x31, das nicht angezeigt werden kann) in Ihrer Zeichenfolge ...

also json encode return false

1
辰凌风

Obwohl diese Frage ein bisschen alt ist und Ihr Problem wahrscheinlich bereits gelöst ist, dachte ich, dass dies für andere relevant sein könnte. Tl; dr: verwendet DB::statement("SET NAMES 'UTF8'"); unmittelbar 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 Alternative zum Kodieren der DB-Ergebnisse in Ihrer Anwendung können Sie in Betracht ziehen, dass die DB dies behandelt. 

Wenn Sie MySQL verwenden, können Sie den Zeichensatz angeben, der mit SET NAMES 'charset_name' an den Server kommuniziert. Dies gibt dem Server an, dass Abfragen mit diesem Zeichensatz gesendet werden, und fordert den Server auf, Ergebnisse mit diesem Zeichensatz zurückzugeben. (siehe Dokumentation )

Laravel erwartet UTF-8-Daten. In diesem Fall können Sie also eine Anweisung ausgeben, in UTF-8 zu kommunizieren, bevor Sie die Ergebnisse auswählen:

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

Bei Bedarf können Sie danach jederzeit wieder auf einen anderen Zeichensatz wechseln. 

0
Arjen