问题描述
一旦我将我的 Laravel 应用程序从 MySQL 移动到 pSQL.我一直收到这个错误.
<块引用>响应内容必须是一个字符串或对象,实现了 __toString(),给出了boolean".
我有一个 API 可以返回我的促销
__对此的任何提示/建议都将是一个巨大的帮助!
TL;DR
仅返回 response()->json($promotion) 并不能解决此问题中的问题.$promotion 是一个 Eloquent 对象,Laravel 会自动为响应进行 json_encode.json 编码失败,因为 img 属性是 PHP 流资源,无法编码.
详情
无论你从控制器返回什么,Laravel 都会尝试转换为字符串.当您返回一个对象时,将调用该对象的 __toString() 魔术方法进行转换.
因此,当您从控制器操作中返回 $promotion 时,Laravel 将对其调用 __toString() 以将其转换为要显示的字符串.
在Model上,__toString()调用toJson(),返回json_encode的结果.因此,json_encode 返回 false,这意味着它遇到了错误.
您的 dd 表明您的 img 属性是一个 stream 资源.json_encode 无法对 resource 进行编码,因此这可能是导致失败的原因.您应该将 img 属性添加到 $hidden 属性以将其从 json_encode 中删除.
class Promotion 扩展模型{受保护的 $hidden = ['img'];//其余课程}
As soon as I move my Laravel App from MySQL to pSQL. I kept getting this error.
The Response content must be a string or object implementing __toString(), "boolean" given.
I have an API that suppose to return my promotion
http://localhost:8888/api/promotion/1
public function id($id){ $promotion = Promotion::find($id); dd($promotion); //I got something here return $promotion; }
It used to return my promotion, now it return an error.
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 }
Content
__ Any hints / suggestions on this will be a huge help!
TL;DR
Just returning response()->json($promotion) won't solve the issue in this question. $promotion is an Eloquent object, which Laravel will automatically json_encode for the response. The json encoding is failing because of the img property, which is a PHP stream resource, and cannot be encoded.
Details
Whatever you return from your controller, Laravel is going to attempt to convert to a string. When you return an object, the object's __toString() magic method will be invoked to make the conversion.
Therefore, when you just return $promotion from your controller action, Laravel is going to call __toString() on it to convert it to a string to display.
On the Model, __toString() calls toJson(), which returns the result of json_encode. Therefore, json_encode is returning false, meaning it is running into an error.
Your dd shows that your img attribute is a stream resource. json_encode cannot encode a resource, so this is probably causing the failure. You should add your img attribute to the $hidden property to remove it from the json_encode.
class Promotion extends Model { protected $hidden = ['img']; // rest of class }