Laravel 10中自定义JSON请求验证逻辑的存放位置咨询
问题
我在控制器中对JSON请求的字段进行验证,为遵循单一职责原则,想创建自定义Validator类并将验证代码移入其中。但执行php artisan make:validator MyValidator命令时,发现该命令在Laravel 10中已不存在。请问以下验证代码应存放在何处?继续放在控制器不符合最佳实践。
$validator = Validator::make($request->json()->all(), [ "field1" => "required", "field2" => "required|numeric", ]); if ($validator->fails()) { return response()->json([ 'message' => __("Please fill required fields"), 'errors' => $validator->errors(), ], 422); }
解决方案
Laravel 10已移除make:validator命令,以下是几种符合框架最佳实践的验证逻辑抽离方案:
1. 使用表单请求类(Form Request)
这是官方推荐的标准做法,专门用于封装请求验证逻辑:
- 执行命令生成表单请求类:
php artisan make:request MyValidationRequest - 在
app/Http/Requests/MyValidationRequest.php中完善规则与消息:<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class MyValidationRequest extends FormRequest { public function authorize(): bool { // 根据业务需求设置权限判断,返回true则允许验证 return true; } public function rules(): array { return [ "field1" => "required", "field2" => "required|numeric", ]; } public function messages(): array { return [ 'field1.required' => '请填写必填字段field1', 'field2.required' => '请填写必填字段field2', 'field2.numeric' => 'field2必须为数字', ]; } } - 控制器中直接注入该请求类,Laravel会自动完成验证,失败时自动返回422状态码的JSON响应:
use App\Http\Requests\MyValidationRequest; public function store(MyValidationRequest $request) { // 验证通过后,可通过$request->validated()获取合规字段 $validatedData = $request->validated(); // 后续业务逻辑 }
2. 手动创建自定义验证器类
若偏好独立的验证器类,可手动创建:
- 在
app目录下新建Validators文件夹,创建MyValidator.php:<?php namespace App\Validators; use Illuminate\Support\Facades\Validator; use Illuminate\Http\JsonResponse; class MyValidator { public static function validate(array $data): JsonResponse|bool { $validator = Validator::make($data, [ "field1" => "required", "field2" => "required|numeric", ]); if ($validator->fails()) { return response()->json([ 'message' => __("Please fill required fields"), 'errors' => $validator->errors(), ], 422); } return true; } } - 控制器中调用验证逻辑:
use App\Validators\MyValidator; use Illuminate\Http\Request; public function store(Request $request) { $validationResult = MyValidator::validate($request->json()->all()); if ($validationResult !== true) { return $validationResult; } // 验证通过后的业务逻辑 }
内容的提问来源于stack exchange,提问作者tolga
相关产品推荐
相关产品推荐

