一,新增接口返回碼配置文件
在config中新增配置文件apicode.php
<?phpreturn [
'apicodes'=>[/*** @Message("OK")* 對成功的 GET、PUT、PATCH 或 DELETE 操作進行響應。也可以被用在不創建新資源的 POST 操作上*/'HTTP_OK' => 200,/*** @Message("Created")* 對創建新資源的 POST 操作進行響應。應該帶著指向新資源地址的 Location 頭*/'CREATED' => 201,/*** @Message("Accepted")* 服務器接受了請求,但是還未處理,響應中應該包含相應的指示信息,告訴客戶端該去哪里查詢關于本次請求的信息*/'ACCEPTED' => 202,/*** @Message("No Content")* 對不會返回響應體的成功請求進行響應(比如 DELETE 請求)*/'NO_CONTENT' => 203,/*** @Message("Not Modified")* HTTP緩存header生效的時候用*/'NOT_MODIFIED' => 304,/*** @Message("Temporary Redirect")* 對應當前請求的響應可以在另一個 URI 上被找到,客戶端應該保持原有的請求方法進行請求*/'TEMPORARY_REDIRECT' => 307,/*** @Message("Bad Request")* 請求異常,比如請求中的body無法解析*/'BAD_REQUEST' => 400,/*** @Message("Unauthorized")* 沒有進行認證或者認證非法*/'UNAUTHORIZED' => 401,/*** @Message("Forbidden")* 服務器已經理解請求,但是拒絕執行它*/'FORBIDDEN' => 403,/*** @Message("Not Found")* 請求一個不存在的資源*/'NOT_FOUND' => 404,/*** @Message("Method Not Allowed")* 所請求的 HTTP 方法不允許當前認證用戶訪問*/'METHOD_NOT_ALLOWED' => 405,/*** @Message("Gone")* 表示當前請求的資源不再可用。當調用老版本 API 的時候很有用*/'GONE' => 410,/*** @Message("Unsupported Media Type")* 如果請求中的內容類型是錯誤的*/'UNSUPPORTED_MEDIA_TYPE' => 415,/*** @Message("Unprocessable Entity")* 用來表示校驗錯誤*/'UNPROCESSABLE_ENTITY' => 422,/*** @Message("Too Many Requests")* 由于請求頻次達到上限而被拒絕訪問*/'TOO_MANY_REQUESTS' => 429,/*** @Message("Internal Server Error")* 服務器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理*/'SERVER_ERROR' => 500,/*** @Message("Bad Gateway")* 作為網關或者代理工作的服務器嘗試執行請求時,從上游服務器接收到無效的響應*/'BAD_GATEWAY' => 502,/*** @Message("Service Unavailable")* 由于臨時的服務器維護或者過載,服務器當前無法處理請求。這個狀況是臨時的,并且將在一段時間以后恢復。如果能夠預計延遲時間,那么響應中可以包含一個 Retry-After* 頭用以標明這個延遲時間(內容可以為數字,單位為秒;或者是一個 HTTP 協議指定的時間格式)。如果沒有給出這個 Retry-After 信息,那么客戶端應當以處理 500 響應的方式處理它*/'SERVICE_UNAVAILABLE' => 50,/*** @Message("Gateway Timeout")*/'GATEWAY_TIMEOUT' => 504,/*** @Message("HTTP Version Not Supported")*/'HTTP_VERSION_NOT_SUPPORTED' => 505]
];
二,新增接口統一響應封裝trait
<?phpnamespace App\traits;use Illuminate\Support\Facades\Response;trait ApiResponse
{/*** @var int*/protected $statusCode = 200;/*** @return mixed*/public function getStatusCode(){return $this->statusCode;}/*** @param $statusCode* @return $this*/public function setStatusCode($statusCode){$this->statusCode = $statusCode;return $this;}/*** @param $data* @param array $header* @return mixed*/public function respond($data, $header = []){return Response::json($data, $this->getStatusCode(), $header);}/*** @param $status* @param array $data* @param null $code* @return mixed*/public function status($status, array $data, $code = null){if ($code) {$this->setStatusCode($code);}$status = ['status' => $status,'code' => $this->statusCode];$data = array_merge($status, $data);return $this->respond($data);}/*** @param $message* @param int $code* @param string $status* @return mixed*/public function error($message, $code = 'BAD_REQUEST'){return $this->status('error', ['message' => $message,'code' => config('apicode.apicodes.'.$code)],config('apicode.apicodes.'.$code));}/*** @param $message* @param string $status* @return mixed*/public function message($message, $status = "success"){return $this->status($status, ['message' => $message]);}/*** @param $data* @param string $status* @return mixed*/public function success($data, $status = "success"){return $this->status($status, compact('data'));}
}
三,使用
先 use ApiResponse;
use ApiResponse;
public function login(Request $request){$input = $request->only('account', 'password');//此處可以自己查數據庫,判斷是否用戶名和密碼正確$user = User::query()->where(['account' => $input['account']])->firstOrFail();//生成token兩種方式//$token = Auth::guard('api')->fromUser($user);$token = JWTAuth::fromUser($user);//dd($token);die;$data['token']="bearer ".$token;$data['user']=$user;return $this->success($data);}
四,接管系統異常返回
首先我們在app/Exceptions目錄新建一個ExceptionHandler.php繼承自同目錄下的Handler.php代碼如下
在render方法里,我們根據.env文件中的APP_DEBUG來判斷,如果是調試模式,我們還是按照默認方式來渲染錯誤,如果是非調試模式,我們就返回JSON格式的信息
<?phpnamespace App\Exceptions;
use App\traits\ApiResponse;
class ExceptionHandler extends Handler
{use ApiResponse;public function render($request, \Throwable $exception){if (env('APP_DEBUG')) {return parent::render($request, $exception);}return $this->error($exception->getMessage(),'UNAUTHORIZED');}
}
然后我們在bootstrap/app.php中,使用我們自定義的異常處理類ExceptionHandler替換掉默認的Handler類
$app->singleton(Illuminate\Contracts\Debug\ExceptionHandler::class,//App\Exceptions\Handler::classApp\Exceptions\ExceptionHandler::class
);