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