web-dev-qa-db-fra.com

Le contenu de la réponse doit être une chaîne ou un objet implémentant __toString (), "boolean", donné après le déplacement vers psql.

Dès que je déplace mon Laravel App de MySQL vers pSQL. Je continue à avoir cette erreur.

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

J'ai une API qui suppose de retourner ma promotion

http: // localhost: 8888/api/promotion/1

public function id($id){
    $promotion = Promotion::find($id);
    dd($promotion); //I got something here
    return $promotion;
}

Il retournait ma promotion, maintenant, il retourne une erreur.


dd ($ promotion);

I got 

Promotion {#410 ▼
  #table: "promotions"
  #connection: null
  #primaryKey: "id"
  #perPage: 15
  +incrementing: true
  +timestamps: true
  #attributes: array:16 [▼
    "id" => 1
    "cpe_mac" => "000D6721A5EE"
    "name" => "qwrqwer"
    "type" => "img_path"
    "status" => "Active"
    "heading_text" => "qwerq"
    "body_text" => "werqwerqw"
    "img" => stream resource @244 ▶}
    "img_path" => "/images/promotion/1/promotion.png"
    "video_url" => ""
    "video_path" => ""
    "account_id" => 1001
    "img_url" => ""
    "footer_text" => "qwerqwerre"
    "created_at" => "2016-08-04 10:53:57"
    "updated_at" => "2016-08-04 10:53:59"
  ]
  #original: array:16 [▶]
  #relations: []
  #hidden: []
  #visible: []
  #appends: []
  #fillable: []
  #guarded: array:1 [▶]
  #dates: []
  #dateFormat: null
  #casts: []
  #touches: []
  #observables: []
  #with: []
  #morphClass: null
  +exists: true
  +wasRecentlyCreated: false
}

Contenu

enter image description here

__ Toute astuce/suggestion à ce sujet sera d'une grande aide!

22
kyo

TL; DR

Le simple retour de response()->json($promotion) ne résoudra pas le problème de cette question. $promotion Est un objet Eloquent qui Laravel json_encode automatiquement pour la réponse. Le codage JSON échoue à cause de la propriété img, qui est une ressource de flux PHP, et ne peut pas être codée.

Détails

Quoi que vous retourniez de votre contrôleur, Laravel tentera de se convertir en chaîne. Lorsque vous retournez un objet, la méthode magique __toString() est invoquée pour effectuer la conversion.

Par conséquent, lorsque vous venez de return $promotion À partir de votre action de contrôleur, Laravel va appeler __toString() pour le convertir en chaîne à afficher.

Sur le Model, __toString() appelle toJson(), qui renvoie le résultat de json_encode. Par conséquent, json_encode Renvoie false, ce qui signifie qu’il rencontre une erreur.

Votre dd indique que votre attribut img est un stream resource. json_encode Ne peut pas coder un resource, c'est donc probablement à l'origine de l'échec. Vous devez ajouter votre attribut img à la propriété $hidden Pour le supprimer de json_encode.

class Promotion extends Model
{
    protected $hidden = ['img'];

    // rest of class
}
16
patricus

Votre réponse doit renvoyer une sorte d'objet Response. Vous ne pouvez pas simplement retourner un objet.

Alors changez-le en quelque chose comme:

return Response::json($promotion);

ou mon préféré en utilisant la fonction d'assistance:

return response()->json($promotion);

Si le retour d'une réponse ne fonctionne pas, il peut s'agir d'un problème d'encodage. Voir cet article: Le contenu de la réponse doit être une chaîne ou un objet implémentant __toString (),\"boolean \" étant donné. "

22
Jared Eitnier

J'ai eu ce problème lorsque j'ai utilisé un appel ajax pour récupérer des données de la base de données. Lorsque le contrôleur a renvoyé le tableau, il l'a converti en booléen. Le problème était que j'avais des "caractères non valides" comme ú (u avec accent).

3
Diego Alves