直接修改 paginate 配置的 type 即可切换分页类,无需改动 vendor;但要自定义 html 结构、移除 aria-label 或替换 为 ,必须编写自定义分页类并重写 render() 和 getlinks() 方法;setconfig() 仅修改文字,不改变标签结构;thinkphp 6.0+ 中配置 'type' => 'simple' 会自动加载 app\paginator\driver\simple 类,要求类文件路径、类名、命名空间严格匹配;未重写 getlinks() 会导致页码范围仍按默认逻辑(如 ±2)生成,需在自定义类中显式实现以控制页码数量与显示规则;跳转输入框需在 render() 中手动拼接 html 与 js,并使用 $page$ 占位符配合 url() 方法生成链接;tp6.3+ 的 simple() 分页不适用同一套渲染逻辑,不可混用。

直接改 paginate 配置里的 type 就能换分页类,不用碰 vendor;但想彻底控制 HTML 结构、去掉 aria-label、改 <ul></ul> 为 <div class="pager">,就必须写自定义类并重写 <code>render() 和 getLinks() —— setConfig() 只换文字,不碰标签。
ThinkPHP 6.0+ 自定义分页类怎么注册生效
配置项 'type' => 'Simple' 是最简路径,TP 会自动拼命名空间 app\paginator\driver\Simple 并加载;类文件必须放在 app\paginator\driver\ 目录下,且类名与文件名严格一致;命名空间声明必须匹配目录结构,否则自动加载失败;别在 config/paginate.php 里写完整路径或 use 语句,TP 不认。
为什么重写了 render() 还是显示默认页码范围
TP6 的 getLinks() 是关键入口,它内部调用 $this->getUrlRange()(protected 方法),而这个逻辑不会因你覆盖 render() 就改变;如果你没重写 getLinks(),页码数组还是按 Bootstrap 默认的“当前页 ±2”生成;常见错误是只改了 HTML 包裹,但页码数量、是否显示首页/尾页仍由原逻辑控制;正确做法是在自定义类中显式实现 getLinks(),例如:return $this->getUrlRange(1, $this->lastPage); 强制显示全部页码。
分页跳转输入框怎么加进自定义 render()
HTML 结构要自己拼,JS 行为得自己绑;在 render() 返回的字符串里插入表单:<input type="number" min="1" max="'.$this->lastPage.'" value="'.$this->currentPage().'"><button onclick="location.href=\''. $this->url('$PAGE$') .'\'.replace(\'$PAGE$\', this.previousElementSibling.value)">跳转</button>;注意 URL 中的占位符要用 $PAGE$ 而非 [PAGE],因为 TP6 的 url() 方法默认识别前者;别依赖框架自动替换,手动拼更可控;如果用了路由而非 URL 构造,跳转链接可能丢参数,统一用 url('index/index', ['page' => $n]) 生成。
真正难的不是写 HTML,而是搞清 getLinks() 和 getUrlRange() 的调用关系——很多人卡在这一步,以为 render 一改就完事,结果页码范围还是不对。另外,TP6.3+ 的 simple() 分页对象不走同一套逻辑,别拿它和 render() 混用。











