thinkphp的paginate()默认参数可通过位置参数和配置数组修改:首参数设每页数量,次参数数组指定'page'(页码键名)、'list_rows'(每页条数)、'query'(透传参数);simple()不支持配置数组,须用simplepaginate();url参数污染需每次新建query数组;自定义样式应使用render()方法或闭包渲染器。

如何修改 paginate() 的默认参数
ThinkPHP 的 paginate() 默认用 page 作为页码键、每页 15 条,但实际项目常要改成 offset/limit、或适配前端传的 pageNum/pageSize。直接改查询链式调用里的参数就行,不用动配置文件。
-
paginate()接收两个位置参数:第 1 个是每页数量($listRows),第 2 个是配置数组($config) - 常用可配项:
'page' => 'pageNum'(指定页码参数名)、'list_rows' => 20(每页条数)、'query' => ['tab' => 'user'](透传到分页链接的额外参数) - 注意:
'page'是当前页码值对应的 URL 参数名,不是“总页数”;'list_rows'和构造器里传的数字冲突时,以构造器参数为准 - 错误写法:
paginate(['page' => 'p'])—— 这会把page当作每页数量解析,报错ArgumentCountError
为什么 simple() 分页不认自定义参数
simple() 是简化分页(只有上一页/下一页),它内部跳过了完整分页类的初始化逻辑,所以 paginate($listRows, $config) 里传的 $config 对它无效。
- 必须显式调用
simplePaginate($listRows, $config)才能生效 - 常见误操作:先写
$query->paginate(10)->simple()—— 这里simple()是对已生成的分页对象做视图切换,参数早已固定 - 如果要用
simple模式且需自定义参数,只能换用simplePaginate(10, ['page' => 'p']) -
simplePaginate()不支持last_page或总条数统计,性能略好,但无法显示“共 X 页”
URL 参数污染:分页链接带多余 query
在控制器里多次调用 paginate()(比如不同条件分支),容易让 query 配置叠加,导致分页链接混入不该出现的参数,例如 ?status=1&status=2&page=2。
- 每次调用前检查
$config['query']是否被复用,避免引用同一个数组变量 - 推荐写法:
paginate(15, array_merge(['page' => 'p'], request()->only(['search', 'category']))),用request()->only()显式控制透传字段 - 别用
input()替代request()->only(),前者可能包含 POST 数据,混进 GET 分页链接会出错 - 如果用了路由变量(如
route('user.index', ['id' => 123])),分页生成的链接不会自动继承这些变量,得手动塞进query
自定义分页样式时,$render 方法失效怎么办
想用 Bootstrap 或 LayUI 样式,覆盖 render() 返回的 HTML,但发现修改后没变化,大概率是模板里没调用 $list->render(),或者用了 ->show()(旧版方法,已废弃)。
- 新版 TP6+ 必须用
$list->render(),它返回字符串;->show()只在 TP5.1 以前有效 - 自定义渲染器要继承
think\Paginator,重写render()方法,但注意:TP6.1+ 默认分页类是think\paginator\driver\Bootstrap,不是基类 - 更稳妥的方式是直接传闭包:
paginate(15, ['render' => function ($pagi) { return '<div class="pager">...' . $pagi->getPreviousButton() . '</div>'; }]) - 闭包里不能直接 echo,必须 return;且
$pagi是实例,可用->currentPage()、->hasPages()等方法判断状态
simplePaginate() 和 paginate() 的配置不互通,以及 render() 在模板中调用方式不对。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











