Yii2的API分页怎么实现_RESTful控制器内置分页配置【方法】

陌磊姑娘_9299

陌磊姑娘_9299

2026-03-25

807人浏览

原创

yii2 activecontroller 默认支持分页,需满足:继承 activecontroller、返回 activedataprovider 实例、请求带 page/per-page 参数;可自定义参数名、扩展 pagesizelimit、手动注入 _meta 分页信息,并确保 query 固化排序与条件。

yii2的api分页怎么实现_restful控制器内置分页配置【方法】

Yii2 RESTful 控制器里怎么开分页

直接给结论:Yii2 的 ActiveController 默认就支持分页,但必须满足两个前提——数据源是 ActiveDataProvider,且请求带 page 和 per-page 参数。不手动写逻辑也能跑起来,但很多人卡在配置没生效。

常见错误现象:GET /api/users 返回全部数据,不分页;或者返回 400 错误说 per-page 超限;又或者分页参数被忽略,始终只返回第一页。

  • 确保控制器继承 ActiveController(不是 Controller),否则 serializeData() 不会自动处理 DataProvider
  • 重写 actions() 方法,显式启用 index 动作,并确认它返回的是 ActiveDataProvider 实例(不是数组或 ArrayDataProvider)
  • per-page 默认上限是 50,超这个值会报错;可在 behaviors() 里调大 pageSizeLimit,比如设成 [1, 200]

怎么控制分页参数名和默认值

Yii2 默认认 page 和 per-page,但前端可能传 offset/limit 或 page_number/page_size。硬改前端成本高,不如后端适配。

关键在 ActiveDataProvider 初始化时的 pagination 配置,以及 UrlRule 对参数的映射是否松散。

  • 在控制器的 index() 方法里,手动 new ActiveDataProvider,把 pagination 设为 ['pageParam' => 'page_number', 'pageSizeParam' => 'page_size']
  • 如果用路由规则做参数转换(比如把 /users?page=2&size=10 映射成 page/per-page),注意 UrlRule::pattern 不影响 query string 解析,得靠 request->get() 预处理
  • 别在 urlManager 里强行重写 query 参数名——Yii2 的分页组件只读 request->get(),不走路由解析

分页响应体里怎么加总条数和页码信息

默认只返回当前页数据,没有 total、pageCount 这类字段。前端要做分页控件就得这些数据,但 Yii2 不自动塞进 JSON 响应里。

Yii Framework 2.0.51
Yii Framework 2.0.51

Yii Framework 2.0.51 官方 Basic 应用模板,适合旧项目兼容、升级验证和开发测试。

下载

原因在于 ActiveController::serializeData() 只序列化 $data(即 dataProvider->getModels()),而分页元信息在 $dataProvider->getPagination() 里,得手动合并。

  • 重写控制器的 serializeData() 方法,在父类返回结果基础上,追加 '_meta' => ['totalCount' => $provider->totalCount, 'pageCount' => $provider->getPagination()->getPageCount()]
  • 注意 totalCount 是全量计数,如果数据量大且查询慢,考虑关掉(设 totalCount = false),或用估算值替代
  • 别在 afterAction 里改响应体——此时 JSON 已序列化,再改容易出编码或结构问题

为什么分页后排序失效或条件丢失

典型表现:加了 orderBy,但第 2 页开始顺序乱;或者带 filter 查询,翻页后条件没了。根本原因是 ActiveDataProvider 的 query 没固化好。

分页过程会多次执行 count() 和 all(),如果 query 是动态构建的(比如每次 index() 都 new 一个没绑定条件的 Query),就会漏掉 filter 或 order。

  • 把过滤逻辑(如 andFilterWhere())写在 ActiveDataProvider 初始化前的 Query 对象上,而不是在 search() 方法里临时拼
  • 确保 orderBy 是硬编码或从安全白名单里取,别依赖用户传的 sort 参数——除非你启用了 Sort 组件并做了字段限制
  • 检查是否误用了 asArray():开了之后 ActiveDataProvider 仍能分页,但某些关联字段或 getter 可能失效,导致排序依据丢失

最易被忽略的一点:ActiveDataProvider 的 query 属性一旦被赋值,就不能再链式调用修改;想动态加条件,得在 new 之前就 finish 掉所有 where/orderBy 调用。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

yii

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
PHP API接口开发与RESTful实践
PHP API接口开发与RESTful实践

本专题聚焦 PHP在API接口开发中的应用,系统讲解 RESTful 架构设计原则、路由处理、请求参数解析、JSON数据返回、身份验证(Token/JWT)、跨域处理以及接口调试与异常处理。通过实战案例(如用户管理系统、商品信息接口服务),帮助开发者掌握 PHP构建高效、可维护的RESTful API服务能力。

2025.11.26

544

16

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2135

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3282

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1096

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3759

7

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6419

3

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.20

3188

5

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

2023.09.04

1138

7

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

2023.09.04

1138

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Yii Framework 2.0 API 官方文档
Yii Framework 2.0 API 官方文档

共0课时 | 0人学习

Yii2.0框架开发实战视频教程
Yii2.0框架开发实战视频教程

共22课时 | 9.3万人学习