You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:08:25