ThinkPHP 5.1 分页需重写自定义类并调整调用方式:命名空间、容器注册、显式传 query 参数、模板用 |raw 过滤,且构造函数须适配新签名。

需要调整。ThinkPHP 5.0.24 到 5.1 的分页不是参数微调问题,而是底层机制变更导致原有分页插件无法直接运行——尤其当你用了自定义分页类(如 page\Page)时,paginate() 第三个参数的结构、配置加载方式和渲染逻辑都变了。
自定义分页类必须重放 extend/ 并更新配置项
5.1 中 paginate() 不再通过 'type' => 'page\Page' 这种字符串路径动态实例化类,而是依赖容器自动解析。若你沿用 5.0 的 extend/page/ 目录结构:
- 确保
page目录放在extend/根下(不是extend/page/Page.php嵌套错层) - 类定义必须声明完整命名空间,例如:
namespace page;,且类名与文件名一致(Page.php内为class Page extends \think\Paginator) -
app/config.php中的'paginate'配置仍可保留'type' => 'page\Page',但该写法仅在 5.1.0–5.1.12 有效;5.1.13+ 推荐改用闭包注册或直接传类名字符串(无命名空间前缀需手动use) - 若报错
Class 'page\Page' not found,优先检查composer dump-autoload -o是否执行,或临时加require_once EXTEND_PATH . 'page/Page.php';
paginate() 第三个参数中的 query 必须显式传入 request 参数
5.1 默认不再自动继承当前 URL 查询参数,['query' => $request->param()] 是必须项,漏掉会导致分页链接丢失搜索条件:
-
$request->param()要在控制器方法中作为依赖注入或通过think\Request::instance()获取,不能用input()替代(后者在 5.1 中已弱化) - 如果用了 POST 搜索 + 分页,
$request->param()会合并 GET 和 POST,但注意:POST 数据在分页跳转时会丢失,实际应统一走 GET 提交表单 - 若需保留非标准参数(如
category_id),得手动 merge:['query' => array_merge($request->param(), ['category_id' => $cid])]
模板中 render() 输出必须用 raw 过滤器且不能嵌套赋值
5.1 的 render() 返回的是 HTML 字符串,但默认被模板引擎转义,不加 |raw 就是纯文本:
立即学习“PHP免费学习笔记(深入)”;
- 错误写法:
{$delList->render()}→ 页面显示一串带标签的源码 - 正确写法:
{$delList->render()|raw}或{:raw($delList->render())} - 不要把
render()结果 assign 给变量再输出,例如$this->assign('page', $list->render());+{$page|raw}可以,但若中间经过 JSON 编码、字符串拼接等操作,HTML 标签会被破坏 - 如果自定义分页类重写了
render(),确认它返回的是未转义的字符串,而非数组或对象
最易忽略的一点:5.1 的分页类构造函数签名和父类 \think\Paginator 不兼容旧版。如果你的 page\Page 类继承自 TP5.0 的分页基类,必须重写 __construct(),把 $items, $listRows, $currentPage, $total, $simple, $options 六个参数按 5.1 的顺序和类型传给 parent::__construct(),否则 render() 会因属性未初始化而报 Notice 或空输出。



















