iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 13
0
Modern Web

你說Codeigniter還能怎麼做?系列 第 13

[Day13] 回傳錯誤與成功

上次我們加入第三方設定來讀取參數內容,這次我們來打造一個專門管理錯誤或是成功的功能吧!

新增設定檔

在傳送API的過程中,我們需要讓對方知道,是否成功或是缺少哪些東西導致錯誤,這時我們會夾帶錯誤訊息與錯誤代碼的內容,這時可以寫在Controller當作最後回傳:

    if ($data) {
      // 正確
      $json_arr['response'] = 'success';
    } else {
      // 回報缺少的內容
      $json_arr['requred'] = $this->getpost->report_required($requiredData, 'GET');
    }

不過當內容一多的時候怎麼辦?這時我們可以像過去新增global.php一樣,專門管理錯誤或是成功的內容,首先我們可以在config資料夾裡分別建立code_error.phpcode_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.phpModels資料夾內:

<?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加入進去:
自動加載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_successcode_error管理錯誤訊息,並且透過我們寫的功能迅速回傳!然而我們今天就到這,明天我們試試看設定語系!See ya!

Next station ... 加入語系


上一篇
[Day12] GET/POST傳入的資料是否正確?
下一篇
[Day14] 加入語系
系列文
你說Codeigniter還能怎麼做?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言