1. 程式人生 > >laravel 中 api介面 使用 FormRequest 驗證時,返回json格式的 validate錯誤資訊

laravel 中 api介面 使用 FormRequest 驗證時,返回json格式的 validate錯誤資訊

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的錯誤資訊了;