6

我正在使用 Laravel 8 构建一个带有分页 JSON 的简单 API。

输出包含一个“链接”对象到“元”键:

{
  "data": [
    {
      . . .
    },
    {
      . . .
    }
  ],
  "links": {
    "prev": null,
    "first": "http://localhost/api/my-api?&page=1",
    "next": null,
    "last": "http://localhost/api/my-api?&page=2"
  },
  "meta": {
    "from": 1,
    "per_page": 400,
    "total": 477,
    "current_page": 1,
    "last_page": 2,
    "path": "http://localhost/api/my-api",
    "to": 400,
    "links": [
      {
        "url": null,
        "label": "Previous",
        "active": false
      },
      {
        "url": "http://localhost/api/my-api?&page=1",
        "label": 1,
        "active": true
      },
      {
        "url": "http://localhost/api/my-api?&page=2",
        "label": 2,
        "active": false
      },
      {
        "url": "http://localhost/api/my-api?&page=2",
        "label": "Next",
        "active": false
      }
    ]
  }
}

我没有找到任何关于它的文档;此外,官方文档没有报告它:

如何删除“链接”对象?

4

2 回答 2

1

用于simplePaginate()实现与文档中相同的示例。https://laravel.com/docs/8.x/pagination#simple-pagination

于 2021-06-15T16:10:55.020 回答
1

这有点诡计,因为我们不想接触源代码。在您的Http/Controller/Api/V1地图或任何您的 API 集合类存在的地方,创建一个名为PaginateResourceResponseExtended.php. 将此代码添加到文件中:

namespace App\Http\Controllers\Api\V1;

use Illuminate\Support\Arr;
use Illuminate\Http\Resources\Json\PaginatedResourceResponse;

class PaginateResourceResponseExtended extends PaginatedResourceResponse
{
    /**
     * Gather the meta data for the response.
     *
     * @param  array  $paginated
     * @return array
     */
    protected function meta($paginated)
    {
        return Arr::except($paginated, [
            'data',
            'first_page_url',
            'last_page_url',
            'prev_page_url',
            'next_page_url',
            'links' //<----- THIS!
        ]);
    }
}

在您的资源集合类中,这是ResourceCollection添加以下内容的扩展: use App\Http\Controllers\Api\V1\PaginateResourceResponseExtended;

在您的类中,您可以覆盖一个ResourceCollection名为的方法preparePaginatedResponse

public function preparePaginatedResponse($request)
{
    if ($this->preserveAllQueryParameters) {
        $this->resource->appends($request->query());
    } elseif (! is_null($this->queryParameters)) {
        $this->resource->appends($this->queryParameters);
    }

    return (new PaginateResourceResponseExtended($this))->toResponse($request);
}

瞧!

当然,您也可以扩展Illuminate\Http\Resources\Json\ResourceCollection;该类,如上所述更改方法并将其扩展到您的所有资源集合。

受保护的meta方法Illuminate\Http\Resources\Json\PaginatedResourceResponse是您想要通过简单地添加'links'到数组异常来更改的方法。

只需交叉手指,您覆盖的 Laravel 源文件方法不会在下一个 Laravel 版本中更改

于 2020-12-10T11:45:01.433 回答