TP8中setConfig(['first_text' => '首页»'])不生效,因Bootstrap分页器已移除该配置项;须新建继承Bootstrap的自定义分页器类重写getFirstButton()和getLastButton()方法,并在paginate()中通过'type'参数指定完整命名空间类名。

ThinkPHP 8 中无法通过配置项或 setConfig() 直接修改首页/尾页文字,必须用自定义分页器类重写 getFirstButton() 和 getLastButton() 方法,再在控制器中显式指定该类。
为什么 setConfig(['first_text' => '首页 »']) 不生效
TP8 的 Bootstrap 分页器已移除 first_text 和 last_text 配置项;这些字段在 6.0+ 版本中被废弃,设了也完全忽略。试图在控制器里调用 $page->setConfig() 属于白忙活。
-
render()只负责拼 HTML,不读取这类文案配置 - 默认模板(如
bootstrap.php)里“首页”“尾页”是硬编码字符串,不是变量 - 直接改 vendor 下的
Bootstrap.php文件 → 升级时必然被覆盖,不可维护
新建自定义分页器类并重写两个方法
最稳妥的做法是新建一个继承 think\Paginator\Bootstrap 的类,只覆盖首页/尾页按钮生成逻辑。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 类文件路径建议:
app\common\paginator\CustomBootstrap.php - 命名空间必须匹配,例如:
namespace app\common\paginator; -
getFirstButton()里返回带自定义文案的链接,比如'首页 »' -
getLastButton()同理,可返回'« 尾页',注意判断$this->hasMore()避免死链 - 不要改动其他方法,保持分页逻辑与原版一致
控制器中显式传入自定义分页器类名
调用 paginate() 时,必须通过 'type' 参数指定完整命名空间类名,框架才认得你写的类。
立即学习“PHP免费学习笔记(深入)”;
- 正确写法:
UserModel::paginate(['list_rows' => 15, 'type' => 'app\common\paginator\CustomBootstrap']); - 错误写法:
'type' => 'CustomBootstrap'(缺命名空间,会报 Class not found) - 错误写法:
->paginate(15)->render('CustomBootstrap')(render()不接受类名字符串) - 模板中仍用
{$list->render()},无需额外参数
别漏掉 config/paginate.php 的兼容性补丁
如果项目启用了全局分页配置(如 config/paginate.php),需确认里面没硬编码 'type' => 'Bootstrap' —— 这会覆盖控制器里的 type 设置。
- 要么删掉该配置项,让控制器参数起效
- 要么把配置改成动态值:
'type' => env('PAGINATE_TYPE', 'Bootstrap'),再通过环境变量切换 - 尤其注意:TP8 默认不加载该配置文件,只有显式调用
config('paginate')或启用分页中间件时才生效


















