上次我們加入第三方設定來讀取參數內容,這次我們來打造一個專門管理錯誤或是成功的功能吧!
在傳送API的過程中,我們需要讓對方知道,是否成功或是缺少哪些東西導致錯誤,這時我們會夾帶錯誤訊息與錯誤代碼的內容,這時可以寫在Controller
當作最後回傳:
if ($data) {
// 正確
$json_arr['response'] = 'success';
} else {
// 回報缺少的內容
$json_arr['requred'] = $this->getpost->report_required($requiredData, 'GET');
}
不過當內容一多的時候怎麼辦?這時我們可以像過去新增global.php
一樣,專門管理錯誤或是成功的內容,首先我們可以在config
資料夾裡分別建立code_error.php
與code_success.php
檔案:
code_error.php
<?php
// 主要放置所有的錯誤碼與預設回應,未來可以自動加載到各個編輯器。
/**
* @apiDefine errCodeExample
* @apiErrorExample {json} Response-Example:
* {
* "sys_code": "回應編號",
* "sys_num": "錯誤編號",
* "sys_msg": "錯誤訊息"
* }
*/
/**
* @apiDefine errCode_40001
* @apiError MISSING_DATA 40001 資料不足
*/
$config['err_code']['MISSING_DATA'] = array(
"sys_code"=> "000",
"sys_num"=> "40001",
"sys_msg"=> array(
"zh-tw"=> '資料不足',
"en-us"=> 'Missing Data'
)
);
?>
code_success.php
<?php
// 主要放置所有的成功碼與預設回應,未來可以自動加載到各個編輯器。
/**
* @apiDefine sucCodeExample
* @apiSuccessExample {json} Response-Example:
* {
* "sys_code": "回應編號",
* "sys_num": "成功編號",
* "sys_msg": "成功訊息"
* }
*/
/**
* @apiDefine sucCode_20001
* @apiSuccess PROCESS_SUCCESS 20001 處理成功
*/
$config['suc_code']['PROCESS_SUCCESS'] = array(
"sys_code"=> "200",
"sys_num"=> "20001",
"sys_msg"=> array(
"zh-tw"=> '處理成功',
"en-us"=> 'Process Success'
)
);
?>
透過這個方式能更有效管理錯誤與成功提示,並且把它分為幾種sys_code
主要代表成功或是錯誤代碼,code_num
主要為代碼的編號,方便日後去查詢,接著就是sys_msg
主要是負責回傳發生的狀況,甚至我們可以為他做個語系處理。
接下來我們回到config/autoload.php
來加入這兩個檔案:
下一步我們就可以透過$this->config->item
來去呼叫他,不過當然不可能那麼簡單,我們要把它模組化,所以我們先新增一個Mod_config.php
在Models
資料夾內:
<?php defined('BASEPATH') or exit('No direct script access allowed');
class Mod_config extends CI_Model {
public function __construct() {
parent::__construct();
$this->errCode = $this->config->item('err_code');
$this->sucCode = $this->config->item('suc_code');
}
}
接著在下方新增回傳程式,msgResponse
主要是判斷成功或是錯誤訊息,裡面$response
主要是避免妨礙到原先的參數(怕被取代掉)所以你會發現就算前方有先新增$json_arr['response']
也不會被取代掉而是合併,而$type
就是判斷正確或錯誤訊息,另外$code
就代表是哪個訊息,而後面就是語系部分,在來到下方的packageResponse
這主要是判斷是否有當下語系,沒有就會切到預設值zh-tw
。
// 取得回傳訊息資料
function msgResponse($response, $type, $code, $lang = 'default') {
if ($type == 'error') {
return array_merge($response, $this->packageResponse($this->errCode[$code], $lang));
} else if ($type == 'success') {
return array_merge($response, $this->packageResponse($this->sucCode[$code], $lang));
}
}
// 打包回傳訊息
function packageResponse($codeData, $lang) {
$resData['sys_code'] = $codeData['sys_code'];
$resData['sys_num'] = $codeData['sys_num'];
if (isset($codeData['sys_msg'][$lang])) {
$resData['sys_msg'] = $codeData['sys_msg'][$lang];
} else {
$resData['sys_msg'] = $codeData['sys_msg']['zh-tw'];
}
return $resData;
}
?>
接著我們打開剛剛的config/autoload.php
,到最下面的$autoload['model'] = array();
把新增的mod_config
加入進去:
下一步我們打開controllers/Unit.php
來去做測試:
function test_getpost() {
// 估計需要的值
$needsData = array('product_id', 'product_name', 'remark');
// 必填欄位
$requiredData = array('product_id', 'product_name');
// 把結果丟到$data
$data = $this->getpost->getpost_data($needsData, $requiredData, 'GET');
if ($data) {
// 正確
$json_arr = $this->mod_config->msgResponse((isset($json_arr))?$json_arr:array(), 'success', 'PROCESS_SUCCESS', 'zh-tw');
} else {
// 回報缺少的內容
$json_arr = $this->mod_config->msgResponse((isset($json_arr))?$json_arr:array(), 'error', 'MISSING_DATA', 'zh-tw');
$json_arr['requred'] = $this->getpost->report_required($requiredData, 'GET');
}
echo json_encode($json_arr); // 把結果印出來測試看看
}
接著我們透過網址去測試,先帶個會錯誤的測試:http://ip-address/unit/test_getpost?product_id=P1231425621
他除了會顯示錯誤還順便夾帶參數跟訊息呢!接著我們帶個成功的參數:http://ip-address/unit/test_getpost?product_id=P1231425621&product_name=灰熊印貓罐頭
如此一來就大功告成了,未來都可以透過code_success
跟code_error
管理錯誤訊息,並且透過我們寫的功能迅速回傳!然而我們今天就到這,明天我們試試看設定語系!See ya!
Next station ... 加入語系