直接改模板比继承paginator更快更稳:复制bootstrap.php到view/paginate/custom.php修改,调用$list->render('custom');用request()->except(['page'])安全保留参数;跳页需前后端配合表单;大数据量启用simple模式跳过count(*)。

直接改模板比继承 Paginator 更快也更稳
ThinkPHP 5.0 的 paginate 返回的是 Paginator 实例,它默认调用内置的 Bootstrap 风格模板(路径类似 thinkphp/library/think/pagination/bootstrap.php),但这个模板是硬编码在类里的,没法通过配置改路径。想换样式,最直接的方式不是重写类,而是复制模板到项目里再修改。
实操建议:
- 在你的视图目录下新建
paginate/子目录,比如application/view/paginate/custom.php - 把框架源码里的
bootstrap.php内容拷过去,删掉不需要的 class、改标签(比如把<ul></ul>换成<nav></nav>)、加图标或文字(如“上一页”→“◀”) - 控制器中调用时显式指定:
$list->render('custom'),注意不带.php后缀 - 模板内可用变量有:
$paginator、$currentPage、$lastPage、$hasPrevious、$hasNext,别用已废弃的$render
appends() 是保留参数的关键,但容易拼出空值
分页链接默认只保留当前路径,像 ?keyword=abc&status=1 这类搜索参数点下一页就丢了。很多人用 $list->appends(request()->only(['keyword', 'status'])),但一旦某个键不存在或为空,URL 就会变成 ?keyword=&status=1,既难看又可能触发后端逻辑异常。
实操建议:
- 用
request()->except(['page'])更安全——它自动过滤掉page,同时只保留有值的参数 - 如果参数来自 POST 表单,需在控制器里手动合并:
$list->appends(array_merge($searchData, ['page' => input('page/d', 1)])) - 中文参数不用额外处理,
appends内部已做urlencode;但如果你自己拼 URL,得确保编码一致,否则可能 404
跳页功能不能靠改 makeUrl,得前端+后端配合
网上有些教程教你在 Paginator 子类里重写 makeUrl 加 target 参数,这其实行不通:分页 HTML 渲染时并不知道你要跳去哪页,它只生成固定页码的链接。真要实现“输入页码→跳转”,必须前端加输入框 + JS 提交,后端接收并重定向。
实操建议:
- 模板里加一个表单:
<form method="get"> <input name="page" type="number" min="1" value="{$currentPage}"><button type="submit">跳转</button> </form> - 确保表单
GET提交时,其他查询参数(如keyword)仍存在——可以用隐藏域:<input type="hidden" name="keyword" value="{$Request.param.keyword|default=''}"> - 控制器不用改,
input('page/d', 1)会自动接管新值,paginate本身支持从请求取page
深分页和大数据量下,别硬扛 COUNT(*)
当数据超百万、又没合适索引时,paginate(20) 会执行 COUNT(*) + LIMIT,COUNT 成为瓶颈。开 simple 模式(即 paginate(20, true) 或 paginate(20, false),取决于 TP5 版本)能跳过总数统计,只查当前页 + 下一页是否存在,响应快得多,但代价是看不到“共 X 条”和末页按钮。
实操建议:
- 前台搜索列表优先用
simple,用户不需要精确总数;后台管理慎用,运营需要总量做判断 - 真要显示估算总数,可手动查:
DB::table('user')->from(DB::raw("(SELECT CEIL(COUNT(*)/20) as pages FROM user) as t"))->value('pages'),再结合simple分页自己拼页码逻辑 - 第 10000 页这种深分页,
offset+limit天然慢,这时该切游标分页(WHERE id > ? ORDER BY id LIMIT 20),而不是死磕paginate
appends 的空值陷阱、模板变量作用域限制、以及 simple 模式对业务语义的实际影响。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











