ApiResponse介面統一響應封裝

PHPer技術棧發表於2022-05-25

ApiResponse

<?php
namespace App\Helpers;
use App\Enums\ApiCode;
use Illuminate\Support\Facades\Response;

trait ApiResponse
{
    /**
     * @var int
     */
    protected $statusCode = ApiCode::HTTP_OK;

    /**
     * @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 failed($message, $code = ApiCode::BAD_REQUEST)
    {
        return $this->status('error', [
            'message' => $message,
            'code' => $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'));
    }
}

HTTP狀態碼列舉

<?php
declare(strict_types=1);
namespace App\Enums;
class ApiCode
{
    /**
     * @Message("OK")
     * 對成功的 GET、PUT、PATCH 或 DELETE 操作進行響應。也可以被用在不建立新資源的 POST 操作上
     */
    const HTTP_OK = 200;

    /**
     * @Message("Created")
     * 對建立新資源的 POST 操作進行響應。應該帶著指向新資源地址的 Location 頭
     */
    const CREATED = 201;

    /**
     * @Message("Accepted")
     * 伺服器接受了請求,但是還未處理,響應中應該包含相應的指示資訊,告訴客戶端該去哪裡查詢關於本次請求的資訊
     */
    const ACCEPTED = 202;

    /**
     * @Message("No Content")
     * 對不會返回響應體的成功請求進行響應(比如 DELETE 請求)
     */
    const NO_CONTENT = 203;

    /**
     * @Message("Moved Permanently")
     * 被請求的資源已永久移動到新位置
     */
    const MOVED_PERMANENTLY = 301;

    /**
     * @Message("Found")
     * 請求的資源現在臨時從不同的 URI 響應請求
     */
    const FOUNT = 302;

    /**
     * @Message("See Other")
     * 對應當前請求的響應可以在另一個 URI 上被找到,客戶端應該使用 GET 方法進行請求。比如在建立已經被建立的資源時,可以返回 303
     */
    const SEE_OTHER = 303;

    /**
     * @Message("Not Modified")
     * HTTP快取header生效的時候用
     */
    const NOT_MODIFIED = 304;

    /**
     * @Message("Temporary Redirect")
     * 對應當前請求的響應可以在另一個 URI 上被找到,客戶端應該保持原有的請求方法進行請求
     */
    const TEMPORARY_REDIRECT = 307;

    /**
     * @Message("Bad Request")
     * 請求異常,比如請求中的body無法解析
     */
    const BAD_REQUEST = 400;

    /**
     * @Message("Unauthorized")
     * 沒有進行認證或者認證非法
     */
    const UNAUTHORIZED = 401;

    /**
     * @Message("Forbidden")
     * 伺服器已經理解請求,但是拒絕執行它
     */
    const FORBIDDEN = 403;

    /**
     * @Message("Not Found")
     * 請求一個不存在的資源
     */
    const NOT_FOUND = 404;

    /**
     * @Message("Method Not Allowed")
     * 所請求的 HTTP 方法不允許當前認證使用者訪問
     */
    const METHOD_NOT_ALLOWED = 405;

    /**
     * @Message("Gone")
     * 表示當前請求的資源不再可用。當呼叫老版本 API 的時候很有用
     */
    const GONE = 410;

    /**
     * @Message("Unsupported Media Type")
     * 如果請求中的內容型別是錯誤的
     */
    const UNSUPPORTED_MEDIA_TYPE = 415;

    /**
     * @Message("Unprocessable Entity")
     * 用來表示校驗錯誤
     */
    const UNPROCESSABLE_ENTITY = 422;

    /**
     * @Message("Too Many Requests")
     * 由於請求頻次達到上限而被拒絕訪問
     */
    const TOO_MANY_REQUESTS = 429;

    /**
     * @Message("Internal Server Error")
     * 伺服器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理
     */
    const SERVER_ERROR = 500;

    /**
     * @Message("Not Implemented")
     * 伺服器不支援當前請求所需要的某個功能
     */
    const NOT_IMPLEMENTED = 501;

    /**
     * @Message("Bad Gateway")
     * 作為閘道器或者代理工作的伺服器嘗試執行請求時,從上游伺服器接收到無效的響應
     */
    const BAD_GATEWAY = 502;

    /**
     * @Message("Service Unavailable")
     * 由於臨時的伺服器維護或者過載,伺服器當前無法處理請求。這個狀況是臨時的,並且將在一段時間以後恢復。如果能夠預計延遲時間,那麼響應中可以包含一個 Retry-After
     * 頭用以標明這個延遲時間(內容可以為數字,單位為秒;或者是一個 HTTP 協議指定的時間格式)。如果沒有給出這個 Retry-After 資訊,那麼客戶端應當以處理 500 響應的方式處理它
     */
    const SERVICE_UNAVAILABLE = 503;

    /**
     * @Message("Gateway Timeout")
     */
    const GATEWAY_TIMEOUT = 504;

    /**
     * @Message("HTTP Version Not Supported")
     */
    const HTTP_VERSION_NOT_SUPPORTED = 505;

    /**
     * @Message("Variant Also Negotiates")
     */
    const VARIANT_ALSO_NEGOTIATES = 506;

    /**
     * @Message("Insufficient Storage")
     */
    const INSUFFICIENT_STORAGE = 507;

    /**
     * @Message("Loop Detected")
     */
    const LOOP_DETECTED = 508;

    /**
     * @Message("Not Extended")
     */
    const NOT_EXTENDED = 510;

    /**
     * @Message("Network Authentication Required")
     */
    const NETWORK_AUTHENTICATION_REQUIRED = 511;

    /**
     * @Message("Network Connect Timeout Error")
     */
    const NETWORK_CONNECT_TIMEOUT_ERROR = 599;
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章