从控制器返回之前,如何将Laravel 5.5中的API资源类转换为数组?

时间:2018-06-20 18:08:20

标签: laravel laravel-5 laravel-5.5

通常,在Laravel 5.5中,使用api资源类时,您只需从控制器方法中返回资源类实例,如下所示:

public function show(Request $request, MyModel $model)
{
    return new MyModelResource($model);
}

这会将模型转换为响应客户端的数组(最终转换为json)。

但是...我试图弄清楚如何从控制器方法返回它之前将所有内容转换为数组。我尝试过:

public function show(Request $request, MyModel $model)
{
    $array = (new MyModelResource($model))->toArray($request);

    // ...
}

这里的问题是,资源上加载的任何关系都不会转换为数组。它们作为资源类的实例显示在$array内部。显然,手动调用toArray()不会导致递归调用,并且->whenLoaded('relationship_name')之类的方法也未得到真正的尊重。

那么我如何让Laravel完成将资源递归转换为数组而不必从我的控制器方法中返回它的所有工作?

2 个答案:

答案 0 :(得分:1)

我相信您正在寻找的是资源类上的resolve方法。参见definition

从它的外观来看,它还应该处理将关系转换为数组的情况。只要确定您是setting up your resource relationships properly

答案 1 :(得分:0)

toArray()resolve()方法都不会将相关模型转换为数组,这确实很烦人,因为您希望它们能够这样做。

最好使用toResponse(null),它将返回一个JsonRepsonse对象。然后,您可以将getContent()方法用于json编码的字符串,或者将getData()方法用于对象。

因此,如果您希望数组不包装在数据变量中,它将是:

$array = json_decode(
    json_encode(
        (new MyModelResource($model))
            ->toResponse(null)
            ->getData()
            ->data
    ), 
true);

丑陋,但与公认的答案不同。