問題描述
一旦我將我的 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
}
這篇關于響應內容必須是實現 __toString()、“boolean"和“boolean"的字符串或對象.移動到 psql 后給出的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!