Yii2实现可变分页的正确方式:支持API请求传入pageSize
在Yii2中实现用户可指定分页大小的正确方式
当然有啦!Yii2本身就内置了支持用户通过请求参数指定每页条目数的功能,不用你手动去解析请求再做额外处理,配置起来非常简单。
核心配置方法
你只需要在pagination配置中,把pageSize的值设置为从请求中获取的参数即可,同时记得设置一个默认值,避免用户未传参时出现异常。
针对SqlDataProvider的示例
$dataProvider = new SqlDataProvider([ 'sql' => 'SELECT * FROM user WHERE status=:status', 'params' => [':status' => 1], 'pagination' => [ // 从GET请求中获取pageSize参数,默认每页20条 'pageSize' => Yii::$app->request->get('pageSize', 20), // 可选但推荐:限制每页最大条目数,防止恶意请求拖垮服务器 'pageSizeLimit' => [1, 100], ], ]);
针对ActiveDataProvider的示例
如果用的是ActiveRecord查询,配置逻辑完全一致:
$dataProvider = new ActiveDataProvider([ 'query' => User::find()->where(['status' => 1]), 'pagination' => [ 'pageSize' => Yii::$app->request->get('pageSize', 20), 'pageSizeLimit' => [1, 100], ], ]);
如何让用户生效?
用户只需要在API请求的URL中添加pageSize参数即可,比如:GET /api/users?pageSize=30
这样接口就会返回每页30条数据。
进阶自定义
如果不想用默认的pageSize作为参数名(比如想改成per_page),可以通过pageSizeParam配置自定义:
'pagination' => [ 'pageSize' => Yii::$app->request->get('per_page', 20), 'pageSizeParam' => 'per_page', 'pageSizeLimit' => [1, 100], ],
重要注意事项
一定要设置pageSizeLimit!这个参数可以限制用户能设置的最小和最大条目数,避免有人传入超大数值(比如10000),导致一次性加载过多数据,严重影响服务器性能。
内容的提问来源于stack exchange,提问作者mrateb
相关产品推荐
相关产品推荐

