我正在使用Laravel API Resource,并且想要将实例的所有部分都转换为数组。
在我的PreorderResource.php
中:
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'exception' => $this->exception,
'failed_at' => $this->failed_at,
'driver' => new DriverResource(
$this->whenLoaded('driver')
)
];
}
然后解决:
$resolved = (new PreorderResource(
$preorder->load('driver')
))->resolve();
乍看之下,方法resolve会适合它,但问题是它无法递归工作。我的资源解析如下:
array:3 [
"id" => 8
"exception" => null
"failed_at" => null
"driver" => Modules\User\Transformers\DriverResource {#1359}
]
如何解析API资源以进行递归数组?
答案 0 :(得分:2)
通常,您应该这样做:
Route::get('/some-url', function() {
$preorder = Preorder::find(1);
return new PreorderResource($preorder->load('driver'))
});
因为这是应该使用响应的方式(当然,您可以从控制器中进行响应)。
但是,如果有任何原因想要手动进行,您可以执行以下操作:
Route::get('/some-url', function() {
$preorder = Preorder::find(1);
$jsonResponse = (new PreorderResource($preorder->load('driver')))->toResponse(app('request'));
echo $jsonResponse->getData();
});
我不确定这是否是您想要的确切效果,但是如果需要,您还可以从$jsonResponse
获取其他信息。 ->getData()
的结果是对象。
您还可以使用:
echo $jsonResponse->getContent();
如果您只需要获取字符串
答案 1 :(得分:0)
迟到的答案,你也可以选择:
Route::get('/some-url', function() {
$preorder = Preorder::find(1);
$jsonResponse = json_decode(json_encode(new PreorderResource($preorder->load('driver'))));
echo $jsonResponse;
});
如果您只想要数组字符串,请删除外部的 json_decode
。
答案 2 :(得分:0)
最简单的方法是生成json并转换回数组。
$resource = new ModelResource($model);
$array = json_decode($resource->toJson(), true);
答案 3 :(得分:-1)
您尝试过toArray()
方法吗?
$resolved = (new PreorderResource(
$preorder->load('driver')
))->toArray();