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 小时前
网络安全——网络渗透测试(密码破译)
网络·web安全·php
两个人的幸福online4 小时前
PHP 实现国密 SM3 踩坑记录:HMAC-SM3 签名对接 CNR 接口
开发语言·php
极创信息5 小时前
国产化信创适配认证高频术语:信创适配、软件自主可控、国产化率、代码溯源率、代码自主率、代码开源率是什么?
java·python·struts·eclipse·开源·php·hibernate
ShiXZ2136 小时前
网络调试四剑客:ping / telnet / nc / netstat 速查指令集
运维·开发语言·网络·php
youandyouyou7 小时前
政务内网屏幕共享选型与私有化部署评估教程:合规、组网、自主可控三支柱
开发语言·php·政务
weixin_BYSJ19878 小时前
springboot小区物业管理小程序---附源码45555
java·javascript·spring boot·python·django·flask·php
2601_965798478 小时前
Plastic Surgery Clinic Web Setup: Deploying Rejuvita WordPress
php·theme·wordpress
2601_9657984710 小时前
Contractor Web Setup: Deploying Bathrooms & Kitchens Theme Fast
前端·web3·php·wordpress
小新讲网安12 小时前
WiFi安全攻防实战:WPA3新协议与传统破解技术全解析
开发语言·网络·安全·php·漏洞·nmap·漏洞检测
90后小陈老师1 天前
PHP 配置默认值失效排查实录:isset 兜底遇上表单空串回填,首页文案是怎么集体消失的
开发语言·php