本文目录导读:

在 Laravel 中,分页参数验证是一个常见需求,以下是几种处理分页参数验证的方法:
基础验证规则
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;
public function index(Request $request)
{
$rules = [
'per_page' => 'nullable|integer|min:1|max:100',
'page' => 'nullable|integer|min:1',
];
$validatedData = $request->validate($rules);
$perPage = $request->input('per_page', 15); // 默认每页15条
$users = User::paginate($perPage);
return response()->json($users);
}
自定义表单请求验证
创建表单请求类:
php artisan make:request PaginationRequest
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class PaginationRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'per_page' => [
'nullable',
'integer',
'min:1',
'max:100',
],
'page' => [
'nullable',
'integer',
'min:1',
],
];
}
public function messages()
{
return [
'per_page.integer' => '每页数量必须是整数',
'per_page.min' => '每页数量不能小于1',
'per_page.max' => '每页数量不能超过100',
'page.integer' => '页码必须是整数',
'page.min' => '页码不能小于1',
];
}
}
在控制器中使用:
public function index(PaginationRequest $request)
{
$perPage = $request->input('per_page', 15);
$users = User::paginate($perPage);
return response()->json($users);
}
自定义验证规则类
创建自定义规则:
php artisan make:rule PaginationRule
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class PaginationRule implements Rule
{
private $maxPerPage;
public function __construct($maxPerPage = 100)
{
$this->maxPerPage = $maxPerPage;
}
public function passes($attribute, $value)
{
if (!is_int($value) && !ctype_digit($value)) {
return false;
}
$value = (int) $value;
return $value >= 1 && $value <= $this->maxPerPage;
}
public function message()
{
return '每页数量必须在1到:max之间';
}
}
使用自定义规则:
use App\Rules\PaginationRule;
public function index(Request $request)
{
$validated = $request->validate([
'per_page' => ['nullable', new PaginationRule(100)],
'page' => ['nullable', 'integer', 'min:1'],
]);
$perPage = $request->input('per_page', 15);
$users = User::paginate($perPage);
}
使用中间件验证
创建中间件:
php artisan make:middleware ValidatePagination
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class ValidatePagination
{
public function handle(Request $request, Closure $next)
{
$rules = [
'per_page' => 'nullable|integer|min:1|max:100',
'page' => 'nullable|integer|min:1',
];
$validator = validator($request->all(), $rules);
if ($validator->fails()) {
return response()->json([
'message' => '分页参数验证失败',
'errors' => $validator->errors()
], 422);
}
return $next($request);
}
}
在 Kernel.php 中注册:
protected $routeMiddleware = [
// ... 其他中间件
'validate.pagination' => \App\Http\Middleware\ValidatePagination::class,
];
在路由中使用:
Route::middleware(['validate.pagination'])->group(function () {
Route::get('/users', 'UserController@index');
});
集成到模型查询
public function index(Request $request)
{
$validated = $request->validate([
'per_page' => 'nullable|integer|min:1|max:100',
'page' => 'nullable|integer|min:1',
]);
$perPage = $validated['per_page'] ?? 15;
// 使用分页
$users = User::where('active', true)
->orderBy('created_at', 'desc')
->paginate($perPage);
// 或者使用简单分页(只有上一页/下一页)
// $users = User::simplePaginate($perPage);
return response()->json($users);
}
高级验证:支持自定义排序
public function index(Request $request)
{
$validated = $request->validate([
'per_page' => 'nullable|integer|min:1|max:100',
'page' => 'nullable|integer|min:1',
'sort_by' => 'nullable|in:id,name,email,created_at',
'sort_order' => 'nullable|in:asc,desc',
]);
$perPage = $validated['per_page'] ?? 15;
$sortBy = $validated['sort_by'] ?? 'created_at';
$sortOrder = $validated['sort_order'] ?? 'desc';
$users = User::orderBy($sortBy, $sortOrder)
->paginate($perPage);
return response()->json($users);
}
推荐做法
- 使用自定义表单请求类:代码更整洁,可复用
- 设置合理的默认值:如每页15或20条
- 限制最大每页数量:防止恶意请求
- 返回友好的错误信息:便于前端处理
- 使用
simplePaginate()提高性能:当不需要总页数时
根据你的项目需求选择合适的验证方式,如果是简单的分页需求,直接在控制器中验证就足够了;如果是复杂的应用,建议使用表单请求类进行统一管理。