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

How do I convert an API resource class in Laravel 5.5 to an array BEFORE returning from controller?

通常,在 Laravel 5.5 中,当使用 api 资源 class 时,您只需 return 来自控制器方法的资源 class 实例,例如所以:

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

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

但是...我试图找出如何在从控制器方法 returning 之前将所有内容转换为数组。我试过这个:

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

    // ...
}

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

那么我如何让 Laravel 完成它所做的一切以递归地将资源转换为数组而不必从我的控制器方法 return 它?

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

从外观上看,它也应该处理将关系转换为数组的问题。请确保您是 setting up your resource relationships properly.

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

您最好使用 toResponse(null),这将 return 一个 JsonRepsonse 对象。然后,您可以对 json 编码字符串使用 getContent() 方法,对对象使用 getData() 方法。

因此,如果您想要一个数组不包含在数据变量中,它将是:

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

丑陋但它的工作方式与公认的答案不同。