TP6接口分页列表返回结构化JSON而非HTML,核心是提取paginate()实例的元信息(当前页、总页数、总数等)与数据组装为标准响应格式,并透传搜索参数以保障翻页条件不丢失。

TP6 接口分页列表接口的核心是返回结构化 JSON 数据,而非 HTML 分页 HTML 字符串。它不调用 render(),而是提取分页元信息(当前页、总页数、总数、每页条数等),与数据一起组装为标准响应格式。
基础分页数据获取
在控制器中直接使用模型或 Db 的 paginate() 方法,传入每页数量即可:
$list = User::where('status', 1)->order('id', 'desc')->paginate(10);- 或使用 Db:
$list = Db::name('user')->where('status', 1)->paginate(10); - 返回的是
Think\Paginator\driver\Bootstrap实例(默认驱动),含数据 + 分页属性
提取分页元信息并构造 JSON 响应
需手动提取关键字段,避免直接输出 HTML。推荐统一返回结构如:
-
data:当前页数据列表(
$list->items()) -
current_page:当前页码(
$list->currentPage()) -
last_page:总页数(
$list->lastPage()) -
per_page:每页条数(
$list->listRows()) -
total:总记录数(
$list->total()) -
has_next_page:是否有下一页(
$list->hasMore()) -
has_prev_page:是否有上一页(
$list->currentPage() > 1)
示例返回代码:
'code' => 1,
'msg' => 'success',
'data' => $list->items(),
'pagination' => [
'current_page' => $list->currentPage(),
'last_page' => $list->lastPage(),
'per_page' => $list->listRows(),
'total' => $list->total(),
'has_next_page' => $list->hasMore(),
'has_prev_page' => $list->currentPage() > 1
]
]);
保留搜索参数(带条件分页)
前端传来的查询参数(如 ?keyword=张&status=1)必须透传到下一页链接逻辑中,否则翻页后条件丢失。TP6 支持通过 'query' 配置项自动拼接:
->paginate(['list_rows' => 10, 'query' => request()->param()])- 该配置不影响 JSON 接口本身,但确保
$list->render()(若后续需要 H5 分页)或前端生成下一页 URL 时能复用参数 - 接口中建议将原始参数也返回给前端:
'request_params' => request()->param(),方便前端维护 URL 状态
自定义分页驱动(可选,用于统一字段名或扩展)
如需全局替换分页字段名(例如把 current_page 改成 page),可继承默认分页类并重写 toArray() 或封装响应方法:
- 新建
app/common/ApiPaginator.php,继承think\paginator\driver\Bootstrap - 重写
toArray()返回适配接口规范的数组结构 - 控制器中改用:
User::paginate(...)->toArray()直接获得定制结构











