laravel8统一接口返回的json格式—通过自定义函数及自定义exception返回成功及失败结果

问题

后端接口需要返回统一的格式,例如返回成功的结果:{“code”:”0”,”message”:”success”,”data”:”18”},返回失败的结果:{“code”:”10000”,”message”:”请选择年龄选项!”,”data”:null},怎样才能方便实现并且尽量优雅呢?

实现

返回成功的结果

先创建一个自定义函数,可以创建文件app\Library\AutoFunctions.php,并添加代码:

<?php

//自定义函数
if (! function_exists('responseApi')) {
    function responseApi($data = null)
    {
        $returnData = json_encode(['code' => '0', 'message' => 'success', 'data' => $data], JSON_UNESCAPED_UNICODE);
        if (json_last_error() == JSON_ERROR_NONE) {
            return $returnData;
        } else {
            return json_encode(['code' => '10000', 'message' => 'json非法字符', 'data' => null], JSON_UNESCAPED_UNICODE);
        }
    }
}

然后让这个文件中的方法能够全局自动加载并使用。实现方法有很多,相比 [bootstrap中require] 或者[comopser autoload]的方式,更建议使用服务提供者的方式:
laravel8安装好后,自动生成并注册了app\Providers\AppServiceProvider(没有生成的可以自己生成下:php artisan make:provider HelperServiceProvider)。我们在这个类中的register方法中引入这个文件:

require_once app_path('library').'/autofunctions.php';

这样就可以全局很方便地使用responseApi函数了,例如我们在某个controller要返回查询结果时,可以这样写:

return responseApi($returnData);

返回失败的结果

采用抛异常的形式,可以方便地在各个层级实现接口的中断返回,而不必层层处理返回信息;先自定义一个异常,例如创建文件app\Exceptions\ApiException.php,并添加代码:

<?php
namespace App\Exceptions;

class ApiException extends \Exception
{
    public function __construct($msg = '', $code = null)
    {
        $code === null && $code = 10000;
        parent::__construct($msg, $code);
    }

    public function render()
    {
        $result = [
            'code' => (string)$this->getCode(),
            'message'  => (string)$this->getMessage(),
            'data' => null
        ];
        return response()->json($result);
    }


}

这样当我们在某处代码想直接返回响应时,就可以这样写:

throw new ApiException('一个月只能发布一条信息,请下个月再来!');

最后

我们可以自定义多个excetion来构造不同的失败信息格式返回,也可以自定义多个全局函数实现不同的成功信息格式返回。

本作品采用《CC 协议》,转载必须注明作者和本文链接
鑫伟
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

个人见解:

  1. responseApi 只能返回 code 为 0 的结果(除非 json 方法报错),业务中往往定义 0 表示成功,responseApi 无法返回失败的结果。
  2. 既然使用了 Laravel ,那就应该有 composer ,使用 composer 中的 autoload 可以实现文件加载,不需要自己手动 require, 具体可查询 composer 引入文件。
  3. ApiException 中,既然 code 为必传参数,且默认值为 1000,那么可直接在方法中写 __construct($message,$code = 1000)
3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!