如何修改PHP/Laravel中request validate的返回状态码?
Laravel 修改 validate() 默认验证错误状态码为 400 的三种实现方法
方法一:自定义请求类(Form Request)重写验证失败逻辑
如果项目中习惯用自定义请求类做验证,可直接在请求类里重写failedValidation方法来修改状态码:
- 生成自定义请求类(若未创建):
php artisan make:request StorePostRequest
- 在
app/Http/Requests/StorePostRequest.php中重写方法:
use Illuminate\Contracts\Validation\Validator; use Illuminate\Validation\ValidationException; protected function failedValidation(Validator $validator) { $exception = ValidationException::withMessages( $validator->errors()->toArray() ); $exception->status = 400; // 将默认422改为400 throw $exception; }
- 控制器中使用该请求类替代原生
validate():
public function store(StorePostRequest $request) { // 验证通过后直接处理业务 $post = Post::create($request->validated()); return response()->json($post); }
方法二:全局统一修改验证异常状态码
若希望所有validate()调用都返回400状态码,可在全局异常处理器中配置:
在app/Exceptions/Handler.php的register方法中添加异常处理逻辑:
use Illuminate\Validation\ValidationException; public function register() { $this->renderable(function (ValidationException $e, $request) { // 针对JSON请求修改状态码,可根据需求调整判断条件 if ($request->expectsJson()) { return response()->json([ 'message' => $e->getMessage(), 'errors' => $e->errors(), ], 400); } }); }
方法三:扩展Request类重写validate方法
不想用自定义请求类或全局配置的话,可扩展Laravel基础Request类,重写validate方法:
- 创建自定义BaseRequest类:
// app/Http/Requests/BaseRequest.php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\ValidationException; class BaseRequest extends FormRequest { public function validate(array $rules, ...$params) { try { parent::validate($rules, ...$params); } catch (ValidationException $e) { $e->status = 400; throw $e; } } }
- 控制器中使用该自定义Request类:
use App\Http\Requests\BaseRequest; public function store(BaseRequest $request) { $request->validate([ 'title' => 'required|unique:posts' ]); // 业务逻辑处理... }
内容的提问来源于stack exchange,提问作者slickieie
相关产品推荐
相关产品推荐

