Laravel Eloquent 资源 Collection 响应

Laravel Eloquent Resource Collection response

所以我正在尝试使用资源 collection 来 return 数据表 json 信息。在我使用 collection 之前,我首先做了一个概念验证,如下所示:

public function index()
{
    $clients = QueryBuilder::for(Client::class)
        ->allowedIncludes('accounts')
        ->get();

    if (request()->ajax()) {
        return DataTables::of($clients)->make(true);
    }

    return view('client.index', compact('clients'));
}

这非常有效,json 响应如下所示:

{data: [{id: "4428", number: "492501", name: "Test Client", email: "test@test.com",…},…]
draw:1
input:{view: "datatable", draw: "1",…}
recordsFiltered:2
recordsTotal:2}

然后我更新了索引调用以使用如下所示的资源 collection:

public function toArray($request)
{
    switch ($request->view) {
        case 'datatable':
            self::withoutWrapping();
            return DataTables::of($this->collection)->make(true);
    }
    return parent::toArray($request);
}

响应现在被放置在 "original" 属性中,并且响应中添加了一堆其他项目。我不明白为什么。它看起来像这样:

*callback: null
*charset: null
*content: <The above response is in here as a string>
*encodingOptions: 0
*statusCode: 200
*statusText: "OK"
*version: "1.0"
exception: null
headers: {}
original: <The above response is in here as an object>

我可以将数据表上的 dataSrc 设置为 original.data,它工作正常,但所有这些额外的东西是从哪里来的?我使用了一些其他资源 collections,但从未添加过所有这些东西。

更新:因为我正在寻找的一切都在 "original" 分页中断以及大多数其他数据表功能。如果我将这个 return 移回控制器,它工作正常。

所以,答案与响应类型有关。 eloquent 资源有一个名为 "toResponse" 的未记录函数,如果您的 return 将成为某种 jsonResponse,您需要修改它而不是 toArray 方法。发生的事情是我 returning 一个 JsonResponse 并且它正在将它变成一个数组并且只是 returning 那个 json 编码。

为了清楚起见,这是我的新资源:

public function toResponse($request)
{
    switch ($request->view) {
        case 'datatable':
            self::withoutWrapping();
            return DataTables::of($this->collection)->toJson();
    }
    return parent::toResponse($request);
}

因此,重申一下,如果您正在 return 数组或正确符合数组的内容(数据表 json 响应不符合),您将覆盖 "toArray"。如果您 return 正在 json 回复,您需要覆盖 "toResponse".

另一种选择是让您的代码从 toArray 开始,但是当您知道您将要 return 一个 json 响应时,您调用 $this->toResponse($request)。选择是你的。