在最近的開發開發項目中,我使用了Dingo/Api
這個第三方Api
庫。Dingo
是個很強大的Api
庫, 但在開發的過程當中,須要自定義響應字段。php
剛開始使用Ding/Api
時,返回以下:json
{ "message": "422 Unprocessable Entity", "errors": { "mobile": [ "手機號格式不正確" ] }, "status_code": 422 }
這是輸入字段驗證錯誤時,Dingo
返回的結果。api
這樣看上去沒什麼問題。由於這邊 status_code 是比較規範的。對於 PHP 來講,直接 json_decode 以後,並無什麼難辦的地方。可是對面安卓和 IOS 則是使用的強類型語言。尤爲是 Java,須要對每個 Json 對象進行新建,而後序列化。因此,這種格式不統一的返回結果,是沒法接受的
解決方法: 咱們須要將全部的異常信息歸總到一個地方,在AppServiceProvider
的boot()
方法中添加app
// 將全部的 Exception 所有交給 App\Exceptions\Handler 來處理 app('api.exception')->register(function (Exception $exception) { $request = Illuminate\Http\Request::capture(); return app('App\Exceptions\Handler')->render($request, $exception); });
而後在App\Exceptions\Handler.php
中的render()
方法中:ide
$class = get_class($exception); switch ($class) { case 'Dingo\Api\Exception\ValidationHttpException': if ($request->expectsJson()) return $this->errorRespond($exception->getErrors()->first(), $exception->getStatusCode()); break; default: if ($request->expectsJson()) return $this->errorRespond('系統休息了', 500000); break; }
再次訪問接口:this
{ "response_status_code": 422, "response_message": "請填寫手機號", "data": [] }