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 协议》,转载必须注明作者和本文链接
推荐文章: