如何在Laravel Paginate API中移除prev和next链接(非前端处理)
移除Laravel Paginate API中的prev和next链接(后端实现方案)
问题背景
除了前端处理外,需要在API端移除Laravel Paginate响应中两类prev/next相关内容:
- 外层
links对象里的prev和next字段 meta.links数组中的「上一页」「下一页」按钮项
同时保留编号分页链接(1-10页、省略号、末尾页面),无需前端拼接处理。
解决方案
方案1:全局修改(所有分页API生效)
在App\Providers\AppServiceProvider的boot方法中,通过宏定义重写分页信息结构:
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Http\Resources\Json\JsonResource; class AppServiceProvider extends ServiceProvider { public function register(): void { // } public function boot(): void { JsonResource::macro('paginationInformation', function ($request, $paginated, $default) { // 移除外层links中的prev、next字段 unset($default['links']['prev'], $default['links']['next']); // 过滤meta.links中的上一页、下一页按钮 $default['meta']['links'] = array_filter($default['meta']['links'], function ($link) { return !in_array($link['label'], ['« Previous', 'Next »']); }); // 重置数组索引,避免索引断层 $default['meta']['links'] = array_values($default['meta']['links']); return $default; }); } }
方案2:单个资源集修改(仅指定API生效)
如果不需要全局修改,可以创建自定义资源集类,针对性重写分页逻辑:
- 创建
TaskCollection类:
<?php namespace App\Http\Resources; use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\ResourceCollection; class TaskCollection extends ResourceCollection { /** * 重写分页信息结构 */ public function paginationInformation($request, $paginated, $default) { // 移除外层links的prev、next unset($default['links']['prev'], $default['links']['next']); // 过滤meta中的上一页、下一页链接项 $default['meta']['links'] = array_filter($default['meta']['links'], function ($link) { return $link['label'] !== '« Previous' && $link['label'] !== 'Next »'; }); $default['meta']['links'] = array_values($default['meta']['links']); return $default; } public function toArray(Request $request): array { return parent::toArray($request); } }
- 在控制器中使用该资源集返回分页数据:
use App\Http\Resources\TaskCollection; use App\Models\Task; public function index() { $tasks = Task::paginate(2); return new TaskCollection($tasks); }
注意事项
- 确认
meta.links中按钮的label值与代码中过滤内容一致(若项目使用中文按钮,需对应修改为「上一页」「下一页」) - 修改后需清除配置缓存:
php artisan config:clear
内容的提问来源于stack exchange,提问作者user13698713
相关产品推荐
相关产品推荐

