本文目录导读:

在 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()提高性能:当不需要总页数时
根据你的项目需求选择合适的验证方式,如果是简单的分页需求,直接在控制器中验证就足够了;如果是复杂的应用,建议使用表单请求类进行统一管理。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播