You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:39:53