我正在更新REST Api类;在每个方法的末尾,我必须调用DoResponse
方法将作为第一个参数传递的数据转换为JSON字符串。
作为要求的一部分,我为每个端点创建了响应对象;所有这些对象都实现\JSONSerializable
class CustomResponseObject implements JsonSerializable {
public function jsonSerialize() {
return [/*...*/];
}
}
然后我在Api方法中实例化那些对象,并将其传递给DoResponse
函数。
function myApiEndpoint() {
$res = new CustomResponseObject();
/*...*/
return $this->DoResponse($res);
}
问题是,所述方法仅接受数组作为第一个参数。
public function DoResponse(array $response = array());
我可以通过传递$res->jsonSerialize()
来解决此问题,但是有一种方法可以在将对象传递给DoResponse
函数时自动对其进行jsonSerialize,而无需更改底层方法?
将JsonSerializable
对象转换为数组的穷人方法是:
function myApiEndpoint() {
$res = new CustomResponseObject();
/*...*/
return $this->DoResponse(json_decode(json_encode($res), true););
}
但是出于性能方面的原因,我建议您在响应对象上实现toArray
方法,如果性能存在问题,可以更有效地执行此操作
要将模型转换为JSON,应使用toJson方法。与toArray一样,toJson方法是递归的,因此所有属性和关系都将转换为JSON。您还可以指定JSON编码选项supported by PHP
return Response::json($res->toArray());
创建响应时,它将负责将对象转换为其jsonSerializable
表示形式,这是Eloquent在内部通过调用toArray()
来完成的。对于简单array
或通用ArrayObject
或Jsonable
(Collections和Models)的内容,就会发生这种情况。
[通常正确的方法是将content-type
标头设置为application/json
,并确保内容为有效的JSON。如果您遵循REST标准,则还请提供适当的HTTP RESPONSE CODE。