ThinkPHP从5.1起不再自动注入全局$paginator变量,分页对象必须由控制器显式assign()传入模板,如$this->assign('users', $users),模板中只能用{$users->render()}等对应变量名访问,且所有分页属性(如currentPage、total)均已改为方法调用。

模板里为什么不能直接用 $paginator?
ThinkPHP 从 5.1 开始移除了全局 $paginator 变量,所有分页对象必须由控制器显式 assign() 传入。如果你在模板里写 {$paginator->render()} 却报错“undefined variable”,不是模板写错了,是控制器根本没传——框架不会自动注入这个变量。
怎么安全地在模板中访问分页对象?
控制器必须明确 assign 一个变量名(比如 $list),模板里就只能用这个名字;它不是固定叫 $paginator,也不是 $_paginates,更不是 $page —— 全看你在 assign() 时怎么命名。
- 控制器写法:
$this->assign('users', $users);→ 模板里用{$users->render()} - 别写
$this->assign('paginator', $users);然后以为所有模板都能复用$paginator—— 这只是你自定义的变量名,不具通用性 - 如果用了多个分页(如用户列表 + 日志列表),必须用不同变量名,否则后 assign 的会覆盖前一个
render() 输出前必须确认的三件事
即使变量传对了,render() 也可能输出空或错乱链接,常见原因集中在 URL 上下文缺失:
- 搜索参数没保留:翻页后
keyword=abc消失 → 必须提前调用$users->appends(request()->except(['page'])) - 路由变量丢失:比如当前在
/admin/user/123,分页链接却变成/admin/user?page=2→ 要手动->appends(['id' => $id]) - URL 后缀干扰(如 .html):导致分页链接 404 → 渲染时加配置:
{$users->render(['url' => url('admin/user', ['id' => $id], false, true)])}
模板里访问分页数据的正确方式
不要依赖属性直取,ThinkPHP 6+ 的分页对象已将多数属性转为方法调用,且部分旧属性(如 firstRow)已被移除:
立即学习“PHP免费学习笔记(深入)”;
- ✅ 正确:
{$users->currentPage()}、{$users->total()}、{$users->lastPage()}、{$users->firstItem()} - ❌ 错误:
{$users->current_page}(不存在)、{$users->total}(返回 null)、{$users->firstRow}(TP6 已删) - 判断是否有分页:
{if $users->hasPages()}...{/if},别用count($users)—— 那只是当前页数据量
最易被忽略的是:模板里所有分页相关调用,都基于你 assign 的那个变量,而不是某个“默认存在”的全局对象;一旦命名不一致或漏传,整个分页逻辑就断在视图层,且错误提示极不明确。



















