laravel ApiResponse接口统一响应封装

一,新增接口返回码配置文件

在config中新增配置文件apicode.php

php 复制代码
<?php



return [
'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

php 复制代码
<?php


namespace 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;

php 复制代码
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格式的信息

php 复制代码
<?php

namespace 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类

php 复制代码
$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    //App\Exceptions\Handler::class
    App\Exceptions\ExceptionHandler::class
);
相关推荐
楷哥爱开发4 小时前
降低网络爬虫成本:基础设施优化指南
服务器·开发语言·php
DigitalOcean11 天前
Laravel 开发者已在 DigitalOcean 上开通超过 10 万台服务器
前端·laravel
两个人的幸福13 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo15 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack15 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户30745969820716 天前
PHP 扩展——从入门到理解
php
鹏仔先生17 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下17 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip17 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒17 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php