think\paginator::make()的$options参数需传入特定键才生效:page(int型当前页码)、list_rows(仅当paginate首参未传数字时生效)、path、query(透传get参数)、fragment、type(分页类名)、var_page(url页码参数名),其他键如order等无效。

think\Paginator::make() 的 $options 参数怎么传才生效
直接调用 paginate() 时你写的配置数组,最终会作为 $options 传进 think\Paginator::make()。但这个参数不是“随便塞什么都认”,它只接收特定键,且部分键会被分页驱动类二次处理或忽略。
常见误操作是把数据库查询选项(比如 order、field)也塞进这里,结果发现没起作用——因为 $options 是给分页器用的,不是给查询构造器用的。
-
page:当前页码值,类型必须是 int,字符串如'2'会被转成 0; -
list_rows:每页条数,仅当paginate()第一个参数没传数字时才生效; -
path:生成链接时的基础路径,不带 query,例如/user/list; -
query:要透传到所有分页链接 URL 中的 GET 参数数组,如['q' => 'php', 'cat' => 'dev']; -
fragment:锚点名,生成链接末尾加#content这种; -
type:指定分页类名(如'Bootstrap'或自定义类'Simple'),必须可自动加载; -
var_page:URL 中页码参数的实际 key 名(默认'page'),和配置里的page键不是一回事。
自定义分页类里 $options 怎么读取和使用
你继承 think\Paginator 写的类,构造函数中能拿到完整的 $options 数组,但它不会自动绑定到实例属性上。想在 render() 里用某个配置,得自己存起来。
比如你想让分页链接默认带 ?source=api,但又不想每次调用都写 appends(),就可以在构造函数里提前合并:
public function __construct($items, $listRows, $currentPage = null, $total = null, $simple = false, $options = [])
{
parent::__construct($items, $listRows, $currentPage, $total, $simple, $options);
// 手动注入默认 query
$this->options['query'] = array_merge(['source' => 'api'], $this->options['query'] ?? []);
}
- 别依赖
$this->config——那是旧版 TP5 的字段,TP6+ 已统一为$this->options; -
$this->options['query']是原始数组,render()里调用$this->url(3)时会自动拼进去; - 如果覆盖了
getUrlRange(),注意它内部也会用到$this->options['query'],别把它 unset 掉。
为什么 setConfig() 不影响 $options 里的结构配置
setConfig() 只改文字文案和模板占位符,比如 setConfig('prev', '? 上一页') 或 setConfig('template', 'custom/paginate'),它完全不碰 $options 里的 HTML 结构控制逻辑。
真正决定分页 HTML 是什么样子的,只有两个地方:
- 你自定义类的
render()方法返回的字符串; - 或者框架内置类(如
Bootstrap)的render()实现,它内部硬编码了<ul class="pagination"></ul>这种结构。
所以如果你看到 setConfig('prev', '上一页') 生效了,但按钮还是套在 <li> 里、样式还是 Bootstrap 那套,别怀疑——$options 没错,只是你没动对地方。
paginate() 传参顺序错乱导致 $options 被误解析
最常踩的坑:把配置数组当第二个参数传,比如 paginate(['page' => 'p'])。这会让 TP 把整个数组当成 $listRows(每页条数),然后报 ArgumentCountError。
正确姿势只有两种:
- 位置参数式:
paginate(15, ['page' => 'p', 'query' => request()->only(['q'])]); - 全配置式:
paginate(false, false, ['page' => input('p/d', 1), 'list_rows' => input('size/d', 15), 'query' => ['p' => input('p'), 'size' => input('size')]])(第二个false表示跳过自动解析 URL)。
TP6.1+ 的 config/paginate.php 里设的 'page' => 'p',只影响自动解析阶段,不影响你手动传参时的键名含义——也就是说,你在配置里写了 'page' => 'p',调用时仍得写 'page' => 'p',不是写 'p' => 'p'。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











