You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel Paginate API中移除prev和next链接(非前端处理)

移除Laravel Paginate API中的prev和next链接(后端实现方案)

问题背景

除了前端处理外,需要在API端移除Laravel Paginate响应中两类prev/next相关内容:

  1. 外层links对象里的prev和next字段
  2. 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'], ['&laquo; Previous', 'Next &raquo;']);
            });
            // 重置数组索引,避免索引断层
            $default['meta']['links'] = array_values($default['meta']['links']);
            
            return $default;
        });
    }
}

方案2:单个资源集修改(仅指定API生效)

如果不需要全局修改,可以创建自定义资源集类,针对性重写分页逻辑:

  1. 创建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'] !== '&laquo; Previous' && $link['label'] !== 'Next &raquo;';
        });
        $default['meta']['links'] = array_values($default['meta']['links']);
        
        return $default;
    }

    public function toArray(Request $request): array
    {
        return parent::toArray($request);
    }
}
  1. 在控制器中使用该资源集返回分页数据:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:04:55