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
);
相关推荐
用户962377954482 小时前
CTF 伪协议
php
BingoGo2 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack2 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo3 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack3 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack4 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo4 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
BingoGo5 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·laravel
JaguarJack5 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理6 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php