laravel 中 api介面 使用 FormRequest 驗證時,返回json格式的 validate錯誤資訊
阿新 • • 發佈:2018-12-26
laravel 中使用 FormRequest類來做資料驗證時,預設是把validator的錯誤資訊寫入session中返回到前端頁面的 $errors中,
前端頁面 顯示如下
@if(count($errors->all())>0) <div class="well"> <ul class="list-group"> @foreach($errors->all() as $err) <li class="list-group-item">{{$err}}</li> @endforeach </ul> </div> @endif
然而,這是前端的頁面(PC頁面),我們現在要說的 API介面
解決辦法,同樣是關注 App\Exceptions\Handler.php 這個檔案是laravel的錯誤處理的地方
同樣是要修改類中的 render() 方法
思路是 當validator驗證出錯的時候 laravel 丟擲的是一個 validateException 類,並且laravel介面路由的字首是 “api/”,那麼我們可能從 request中匹配 路由是 “api/*” 的路由,如果是,並且 $exception 是 validateException的一個例項,則返回出自己定義的json資料
原始render()方法如下
public function render($request, Exception $exception)
{
return parent::render($request, $exception);
}
修改後的方法如下
public function render($request, Exception $exception) { //如果路由中含有“api/”,則說明是一個 api 的介面請求 if($request->is("api/*")){ //如果錯誤是 ValidationException的一個例項,說明是一個驗證的錯誤 if($exception instanceof ValidationException){ $result = [ "code"=>422, //這裡使用 $exception->errors() 得到驗證的所有錯誤資訊,是一個關聯二維陣列,所以 使用了array_values()取得了陣列中的值,而值也是一個數組,所以用的兩個 [0][0] "msg"=>array_values($exception->errors())[0][0], "data"=>"" ]; return response()->json($result); } } return parent::render($request, $exception); }
此時當驗證器 FromRequest驗證錯誤的時候,就會返回json的錯誤資訊了;