Laravel-如何将API资源递归转换为数组?

时间:2018-09-27 14:24:18

标签: php laravel laravel-5.6 laravel-response laravel-resource

我正在使用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资源以进行递归数组?

4 个答案:

答案 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();