Laravel分页参数验证规则吗

wen PHP项目 6

本文目录导读:

Laravel分页参数验证规则吗

  1. 基础验证规则
  2. 自定义表单请求验证
  3. 自定义验证规则类
  4. 使用中间件验证
  5. 集成到模型查询
  6. 高级验证:支持自定义排序
  7. 推荐做法

在 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);
}

推荐做法

  1. 使用自定义表单请求类:代码更整洁,可复用
  2. 设置合理的默认值:如每页15或20条
  3. 限制最大每页数量:防止恶意请求
  4. 返回友好的错误信息:便于前端处理
  5. 使用 simplePaginate() 提高性能:当不需要总页数时

根据你的项目需求选择合适的验证方式,如果是简单的分页需求,直接在控制器中验证就足够了;如果是复杂的应用,建议使用表单请求类进行统一管理。

抱歉,评论功能暂时关闭!