Laravel自定义Ajax验证方法问题:验证失败时程序未终止执行
解决Laravel自定义验证方法返回JSON后程序未终止的问题
我来帮你分析下问题所在~你遇到的情况是因为**validateAjax方法里的return response()->json(...)只是从当前方法返回,并没有终止整个请求的执行流程**。比如你在控制器里调用这个方法后,代码还会继续往下执行后续逻辑,所以看起来程序没“终止”。
要解决这个问题,有两种常见的思路:
方法一:抛出验证异常(推荐,和Laravel原生逻辑一致)
Laravel的原生validate方法之所以能终止流程,是因为它在验证失败时抛出了ValidationException,框架的异常处理器会自动捕获这个异常并返回对应的响应(AJAX请求返回JSON,普通请求重定向)。你可以参考这个逻辑修改你的方法:
<?php namespace App\Libs; use Illuminate\Http\Request as RequestCore; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\ValidationException; // 引入验证异常类 class Request extends RequestCore { public function validateAjax($data){ $input = $this->all(); $validator = Validator::make($input,$data); if ($validator->fails()) { // 抛出验证异常,并指定返回的消息和状态码 throw ValidationException::withMessages([ 'message' => 'Invalid Input', 'errors' => $validator->errors()->toArray() ])->status(401); } return true; } }
这样当验证失败时,异常会被框架捕获,直接返回你定义的JSON响应,同时终止后续代码的执行,和原生validate方法的行为一致。
方法二:在控制器中判断并返回响应
如果你不想抛出异常,也可以在调用validateAjax方法时,判断返回值是否是JSON响应,如果是就直接return出去:
// 控制器中的示例代码 public function store(Request $request) { $rules = [ // 你的验证规则 'name' => 'required', 'email' => 'required|email' ]; $response = $request->validateAjax($rules); // 如果返回的是JSON响应,直接return终止流程 if ($response instanceof \Illuminate\Http\JsonResponse) { return $response; } // 验证通过,继续执行后续逻辑 // ... }
不过这种方式需要在每个调用validateAjax的地方都做判断,不如抛出异常的方式简洁。
另外补充一句:其实Laravel原生的validate方法已经支持AJAX请求自动返回JSON了——当请求头包含X-Requested-With: XMLHttpRequest或者Accept: application/json时,验证失败会自动返回JSON响应而不是重定向,你可以先试试原生功能是否满足你的需求哦~
内容的提问来源于stack exchange,提问作者Vk Bishu
相关产品推荐
相关产品推荐

