Laravel 8 REST API CRUD场景下路由参数id验证优化方案问询
解决方案
Laravel 本身提供了两种开箱即用的实现方式,不需要你手动合并路由参数到验证数组:
方案1:使用表单请求验证(Form Request,推荐)
这是Laravel官方推荐的验证逻辑分离方案,默认支持读取路由参数:
- 首先生成对应接口的表单请求类
php artisan make:request UpdateUserRequest
- 重写请求类的
validationData方法,自动合并路由参数到验证数据源:
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class UpdateUserRequest extends FormRequest { // 合并路由参数到验证数据 protected function validationData() { return array_merge($this->all(), $this->route()->parameters()); } public function rules() { return [ 'id' => 'required|exists:users,id,deleted_at,NULL', 'name' => 'required', 'surname' => 'required', 'email' => 'required|email:rfc,dns' ]; } }
- 控制器中直接注入请求类即可,无需手动创建验证器:
public function update(UpdateUserRequest $request) { // 走到这里已经验证通过,直接拿验证后的数据即可 $validated = $request->validated(); }
如果你只需要校验路由id,还可以直接用路由模型绑定简化:
路由保持正常定义PUT: users/{user},控制器方法直接注入对应模型,Laravel会自动校验该id是否存在(如果模型开启了软删除,默认会排除已删除的数据):
public function update(\App\Models\User $user, Request $request) { // 能进到这个方法说明$user对应id存在且未删除,不需要单独写id的exists验证 }
方案2:全局中间件自动注入路由参数
如果你需要所有路由的参数都自动合并到请求数据中,可以自定义全局中间件:
- 生成中间件
php artisan make:middleware MergeRouteParamsToRequest
- 编写中间件逻辑
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class MergeRouteParamsToRequest { public function handle(Request $request, Closure $next) { // 自动合并所有路由参数到请求输入中 $request->merge($request->route()->parameters()); return $next($request); } }
- 注册中间件到
app/Http/Kernel.php对应的中间件组,比如API接口就加到api数组中:
protected $middlewareGroups = [ 'api' => [ // 其他原有中间件 \App\Http\Middleware\MergeRouteParamsToRequest::class, ], ];
配置完成后所有该组下的路由,你都可以直接用$request->all()拿到包含路由参数的所有数据,验证的时候也不需要手动合并id了。
内容的提问来源于stack exchange,提问作者francisco
相关产品推荐
相关产品推荐

