web-dev-qa-db-fra.com

Le contenu de la réponse doit être une chaîne ou un objet implémentant __toString (),\"booléen \" donné. "

J'essaie de renvoyer une vue rendue à l'aide de Response::json mais j'obtiens l'erreur

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

Ceci est mon code:

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

return Response::json($data);

Si je var_dump($data) j'obtiens ceci:

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

Ceci est la vue posts.partials.loadHome:

@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

J'ai testé cela sur localhost et tout fonctionne bien. Quel pourrait être le problème?

22
Alen

Assurez-vous qu'il n'y a pas de caractères illégaux. J'ai eu ce problème une fois et ai exécuté utf8_encode sur la chaîne et cela a résolu le problème.

15
user2778080

Je me suis précipité vers cet article de blog et pense que cela donne une très bonne idée pour le corriger: 

Ce genre d'erreur vous tuera si vous voulez le déboguer ou tracer étape par étape, vous ne trouverez jamais la solution à cause de cette erreur arrive en réponse, je veux dire qu'il sera détecté par le cadre seulement après que la réponse est prête à être rendue, donc c'est comme le le message dit "la réponse est booléenne". Cela arrivera souvent dans le voir que certaines variables affectent le contenu de la réponse. Il suffit de vérifier le affichez les variables une par une et supprimez chacune d’elles l’essai d’exécuter encore . vous trouverez la variable qui cause cette erreur. Mais avant aller dans ce chemin essayer de changer la vue par une autre page de vue (modèle de lame) et voyez si l'erreur est toujours là. si ce n'est pas le cas , puis le problème dans la page de vue.

12
WillyBurb

Crée la fonction suivante

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

Essayez de faire ce qui suit

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

Dans mon cas l'erreur 

le contenu de la réponse doit être une chaîne ou un objet implémentant __toString (), "boolean".

cela apparaît également, même en éliminant les variables de vue une à une ou en utilisant une autre vue (comme suggéré par WillyBurb ). Alors sa réponse ne fonctionnait pas pour moi. 

Après une longue recherche, j'ai découvert que le problème était causé par les colonnes suivantes:

  • created_at 
  • updated_at
  • deleted_at.

Après les avoir ajoutés à la propriété $hidden, l'erreur avait disparu.

des docs:

Masquage des attributs de la conversion de tableau ou JSON

Parfois, vous souhaiterez peut-être limiter les attributs inclus dans le tableau ou le formulaire JSON de votre modèle, tels que les mots de passe. Pour ce faire, ajoutez une définition de propriété masquée à votre modèle:

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

Vous pouvez essayer ceci s'il vous plaît? im retourne vrai ou faux (une valeur booléenne) et non une valeur de réponse comme celle-ci

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

premier :

cette erreur ne s'est produite que lorsque vous return false;

cela signifie Response::json($data) == false.

seconde :

un caractère que JSON ne peut pas encoder 

peut-être , du caractère ASCII (comme 0x00~0x31 qui ne peut pas s'afficher) dans votre chaîne ...

alors, json encode return false

1
辰凌风

Bien que cette question soit un peu ancienne et que votre problème soit probablement déjà résolu, j’ai pensé que cela pourrait être pertinent pour d’autres. Tl; dr: utilise DB::statement("SET NAMES 'UTF8'"); juste avant de récupérer les résultats de la base de données.

Vos données sont probablement stockées dans un jeu de caractères autre que UTF-8 dans la base de données, par exemple lantin1. Au lieu de coder les résultats de la base de données dans votre application, vous pouvez envisager de laisser la base de données s'en charger. 

Lorsque vous utilisez MySQL, vous pouvez spécifier le jeu de caractères avec lequel communiquer avec le serveur à l'aide de SET NAMES 'charset_name'. Cela indique au serveur que les requêtes sont envoyées à l'aide de ce jeu de caractères et lui demande de renvoyer les résultats à l'aide de ce jeu de caractères. (voir documentation )

Laravel attend les données UTF-8. Donc, dans ce cas, vous pouvez émettre une déclaration demandant de communiquer en UTF-8 avant de sélectionner les résultats:

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

Si nécessaire, vous pouvez toujours revenir à un autre jeu de caractères par la suite. 

0
Arjen