php - 每当我使用带有分页方法的 Laravel 资源时,我都会收到带有“链接”和“元”键的响应。我想将这些键更改为新格式
问题描述
我将 laravel 资源用于我的 api 响应并添加了分页方法。使用分页方法时,我总是得到这样的结果,其中 laravel 默认提供三个键,即“数据”、“链接”和“元”。但我想根据自己的需要更改资源。
{
"data": [
{
"id": 1,
"name": "Eladio Schroeder Sr.",
"email": "therese28@example.com",
},
{
"id": 2,
"name": "Liliana Mayert",
"email": "evandervort@example.com",
}
],
"links":{
"first": "http://example.com/pagination?page=1",
"last": "http://example.com/pagination?page=1",
"prev": null,
"next": null
},
"meta":{
"current_page": 1,
"from": 1,
"last_page": 1,
"path": "http://example.com/pagination",
"per_page": 15,
"to": 10,
"total": 10
}
}
但我想要这样的结果
{
"data": [
{
"id": 1,
"name": "Eladio Schroeder Sr.",
"email": "therese28@example.com",
},
{
"id": 2,
"name": "Liliana Mayert",
"email": "evandervort@example.com",
}
],
"metadata": {
"pagination": {
"offset": 50,
"limit": 25,
"previousOffset": 25,
"nextOffset": 75,
"currentPage": 3,
"pageCount": 40,
"totalCount": 1000
}
}
}
我怎么能做到这一点。我正在使用 Laravel 7.*
我的控制器代码:
public function index(Request $request)
{
return DiscussionResource::collection($this->discussion->getDiscussionList($request));
}
我的模型方法如下所示:
public function getDiscussionList($request){
return $this->ofSearch($request)
->orderBy('created_at', config('settings.pagination.order_by'))
->paginate(config('settings.pagination.per_page'));
}
我的资源如下所示:
class DiscussionResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'question_id' => $this->question_id,
'user_id' => $this->user_id,
'user_image' => $this->user->userProfile->image,
'user_role' => $this->user->type,
'comment' => $this->comment,
'is_pinned' => $this->is_pinned,
'created_at' => $this->created_at->toDateString()
];
}
}
解决方案
在 laravel 中有很多方法可以做到这一点,这里有两种方法:
第一种方式:您可以创建自定义PaginatedResourceResponse
并覆盖默认的paginationLinks
. 例如如下:
use Illuminate\Http\Resources\Json\PaginatedResourceResponse;
class CustomPaginatedResourceResponse extends PaginatedResourceResponse
{
protected function paginationLinks($paginated)
{
return [
'prev' => $paginated['prev_page_url'] ?? null,
'next' => $paginated['next_page_url'] ?? null,
];
}
protected function meta($paginated)
{
$metaData = parent::meta($paginated);
return [
'current_page' => $metaData['current_page'] ?? null,
'total_items' => $metaData['total'] ?? null,
'per_page' => $metaData['per_page'] ?? null,
'total_pages' => $metaData['total'] ?? null,
];
}
}
然后覆盖toResponse
方法(实际上,该toResponse
方法将资源集合转换为响应)
public function toResponse($request)
{
return $this->resource instanceof AbstractPaginator
? (new CustomPaginatedResourceResponse($this))->toResponse($request)
: parent::toResponse($request);
}
如果您想进一步自定义您的响应,您可以考虑覆盖其他方法。
第二种方式:您可以覆盖中的toResponse
方法ResourceCollection
并按照您的意愿进行操作!
推荐阅读
- visual-studio - 查看设计器中的断点列
- git - 从 vscode 的源代码控制中排除 .history/
- python - 从 JavaScript 代码字符串中抓取特定文本
- javascript - AngularJs获取下载附件的请求
- erlang - 将 Learn You Some Erlang 教程从 gen_fsm 转换为 gen_statem
- esp32 - 无法接收通过 LoRa 发送的第二条或第三条消息
- reactjs - VS Code 任务:在创建文件夹上运行
- regex - Ansible:在变量周围加上引号,但前提是引号不存在
- javascript - 正则表达式映射我的所有单词(即使重复)
- c# - 迁移 - 实体框架数据库优先方法