Laravel 10.x 全局配置分页每页条数的实现方法
Laravel 10.x 全局配置分页每页记录数
问题背景
在Laravel 10.x中,我们通常通过以下代码指定分页的每页记录数:
$payments = Payment::paginate(10); $users = User::paginate(10);
但后续如果需要统一修改这个数值,逐个修改代码会非常繁琐。如何通过全局配置实现灵活、统一的设置?
用户已尝试的两种方法:
- 在
config目录创建pagination.php配置文件:
<?php return [ 'per_page' => 1, ];
- 修改
AppServiceProvider.php的boot方法:
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Pagination\Paginator; class AppServiceProvider extends ServiceProvider { public function register(): void { // } public function boot(): void { Paginator::perPage(1); } }
推荐解决方案
方案一:配置文件+服务提供者结合(最灵活)
这种方式既支持全局统一默认值,也能为特定模型单独设置分页数量,同时保留临时覆盖的能力。
- 完善
config/pagination.php配置文件:
<?php return [ // 全局默认每页记录数 'default_per_page' => 10, // 特定模型的自定义分页数量(按需添加) 'models' => [ App\Models\User::class => 20, App\Models\Payment::class => 15, ], ];
- 修改
AppServiceProvider.php的boot方法,读取配置并生效:
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Pagination\Paginator; class AppServiceProvider extends ServiceProvider { public function register(): void { // } public function boot(): void { // 设置全局默认分页数量 Paginator::defaultPerPage(config('pagination.default_per_page')); // 为指定模型绑定自定义分页数量 foreach (config('pagination.models', []) as $modelClass => $perPage) { if (class_exists($modelClass)) { $modelClass::query()->macro('paginate', function ($perPageOverride = null, $columns = ['*'], $pageName = 'page', $page = null) use ($perPage) { $finalPerPage = $perPageOverride ?? $perPage; return parent::paginate($finalPerPage, $columns, $pageName, $page); }); } } } }
使用方式:
- 全局模型默认用配置的10条:
$payments = Payment::paginate(); - User模型用配置的20条:
$users = User::paginate(); - 临时覆盖配置值:
$users = User::paginate(50);
方案二:仅全局默认配置(简单场景)
如果不需要为特定模型单独设置,直接用最简单的全局默认配置即可。
- 保留
config/pagination.php的基础配置:
<?php return [ 'default_per_page' => 10, ];
- 在
AppServiceProvider中设置全局默认:
public function boot(): void { Paginator::defaultPerPage(config('pagination.default_per_page')); }
使用方式:
- 不传参数用全局默认:
$payments = Payment::paginate(); - 临时修改:
$payments = Payment::paginate(50);
方案三:模型基类定义(面向模型维度)
如果希望每个模型自主控制默认分页数量,可以通过基类统一管理。
- 创建
app/Models/BaseModel.php基类:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class BaseModel extends Model { // 全局模型默认分页数,子类可重写 protected $perPage = 10; }
- 让业务模型继承该基类,按需重写默认值:
<?php namespace App\Models; class User extends BaseModel { // User模型单独设置默认分页数为20 protected $perPage = 20; }
使用方式:
- 使用模型默认值:
$users = User::paginate(); - 临时覆盖:
$users = User::paginate(50);
内容的提问来源于stack exchange,提问作者mahdieight
相关产品推荐
相关产品推荐

