laravel8統一介面返回的json格式—通過自定義函式及自定義exception返回成功及失敗結果

鑫偉發表於2020-10-13

問題

後端介面需要返回統一的格式,例如返回成功的結果:{“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 協議》,轉載必須註明作者和本文連結
鑫偉

相關文章