如何在Lumen中实现类似Laravel的Form Request验证以移除控制器内的验证代码
在Lumen中实现类似Laravel的Form Request验证方式
没问题!Lumen默认确实没有像Laravel那样内置Form Request验证机制,但我们可以手动搭建一套完全一致的实现,把验证逻辑从控制器里抽离出来。下面是具体步骤:
1. 创建Form Request基类
首先在项目的app/Http/Requests目录下创建一个基类(如果目录不存在就手动新建),让所有自定义请求类都继承它:
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Contracts\Validation\Validator; use Illuminate\Http\Exceptions\HttpResponseException; abstract class Request extends FormRequest { /** * 默认授权通过,你可以根据业务需求重写这个方法 */ public function authorize() { return true; } /** * 重写验证失败的响应逻辑,和你原来控制器里的处理保持一致 */ protected function failedValidation(Validator $validator) { throw new HttpResponseException($this->validationErrors($validator->errors())); } /** * 复用你原来的错误格式化方法 */ protected function validationErrors($errors) { return response()->json([ 'status' => 'error', 'messages' => $errors->all() ], 422); } }
2. 创建自定义请求类
接下来创建对应接口的请求类,比如PostJobRequest.php,在里面定义验证规则和自定义提示信息:
<?php namespace App\Http\Requests; class PostJobRequest extends Request { /** * 定义验证规则 */ public function rules() { return [ 'title' => 'required', 'job_type_id' => 'required|exists:job_type,id', 'work_level_id' => 'required|exists:work_level,id', 'no_of_candidate' => 'required', ]; } /** * 自定义验证提示信息 */ public function messages() { return [ 'title.required' => __('message.validation.title.required'), 'job_type_id.required' => __('message.validation.job_type_id.required'), 'job_type_id.exists' => __('message.validation.job_type_id.exists'), 'work_level_id.required' => __('message.validation.work_level_id.required'), 'work_level_id.exists' => __('message.validation.work_level_id.exists'), 'no_of_candidate.required' => __('message.validation.no_of_candidate.required'), ]; } }
3. 启用Form Request服务
打开bootstrap/app.php,确保以下配置已经开启:
- 启用Facades(默认可能被注释了)
- 启用Eloquent(如果用到了
exists这类数据库验证规则需要这个) - 注册Form Request服务提供者
修改后的关键代码如下:
// 启用Facades $app->withFacades(); // 启用Eloquent(如果你的验证规则涉及数据库查询) $app->withEloquent(); // 注册Form Request服务提供者 $app->register(Illuminate\Foundation\Providers\FormRequestServiceProvider::class);
4. 修改控制器方法
最后把控制器里的Request注入换成我们自定义的请求类,验证逻辑会自动执行,只有验证通过才会进入方法体:
<?php namespace App\Http\Controllers; use App\Http\Requests\PostJobRequest; class YourController extends Controller { public function post(PostJobRequest $request) { // 这里的代码只有在验证通过后才会执行 // 直接使用$request获取经过验证的参数即可,比如$request->input('title') } }
这样就完全实现了和Laravel一致的Form Request验证方式,验证逻辑和控制器彻底解耦,维护起来更方便!
内容的提问来源于stack exchange,提问作者Bhupendra Sapkota
相关产品推荐
相关产品推荐

