iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 26
0
Modern Web

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

[Day26] RESTful API Part3

上次透過函式來驗證API是否有在名單內,而接下來就針對不同的類型去撰寫,先來看看上次寫的函式Api.php

$res = $this->check_api_table($path_name, $func_name);
if ($res) {
  // working
} else {
  // 找不到API,回報錯誤
  $json_arr = $this->mod_config->msgResponse((isset($json_arr))?$json_arr:array(), 'error', 'DATA_FAIL', $this->language);
}

接著我們加入工作,分別把參數與資料帶入進去:

$res = $this->check_api_table($path_name, $func_name);
if ($res) {
  // 取得名單上的API
  $rt = $this->config->item('routes_table');
  $json_arr = $this->to_work($path_name, $func_name, $this->get_post_data($rt[$path_name]['detals'][$func_name]['type']));
} else {
  // 找不到API,回報錯誤
  $json_arr = $this->mod_config->msgResponse((isset($json_arr))?$json_arr:array(), 'error', 'DATA_FAIL', $this->language);
}

接著新增一個函式to_work

  // 進行日常預設工作
  function to_work($path_name, $func_name, $data) {
    if ($func_name == 'exist') {
      return $this->to_work_exist($path_name, $func_name, $data);
    } else if ($func_name == 'get_list') {
      return $this->to_work_get_list($path_name, $func_name, $data);
    } else if ($func_name == 'get_once') {
      return $this->to_work_get_once($path_name, $func_name, $data);
    } else if ($func_name == 'insert') {
      return $this->to_work_insert($path_name, $func_name, $data);
    } else if ($func_name == 'update') {
      return $this->to_work_update($path_name, $func_name, $data);
    } else if ($func_name == 'delete') {
      return $this->to_work_delete($path_name, $func_name, $data);
    }
  }

我們預設總共會有6種方法,不過如果不夠也可以自己自訂,
我們就先以基礎的修刪改查來下手,接續我們新增接續的函式:

  // 檢查名稱是否存在
  function to_work_exist($path_name, $func_name, $data) {
  }
  // 取得特定多筆資料
  function to_work_get_list($path_name, $func_name, $data) {
  }
  // 取得特定單筆資料
  function to_work_get_once($path_name, $func_name, $data) {
  }
  // 新增資料
  function to_work_insert($path_name, $func_name, $data) {
  }
  // 修改資料
  function to_work_update($path_name, $func_name, $data) {
  }
  // 刪除資料
  function to_work_delete($path_name, $func_name, $data) {
  }

接著我們針對to_work_exist新增檢查的功能,首先我們寫入需要的內容:

// 檢查名稱是否存在
function to_work_exist($path_name, $func_name, $data) {
  // 取得table內容
  $methods = $this->config->item('routes_table');
  $table = $methods[$path_name]['table'];
  $info = $methods[$path_name]['detals'][$func_name];
}

接著驗證我們所需要的元素透過require

  ... 以上省略

  // 驗證需要的元素
  $required = array();
  foreach ($info['require'] as $keyRequired => $valueRequired) {
    if (!isset($data[$valueRequired])) array_push($required, $valueRequired);
  }
  
  ... 以下結尾

接著確認是否有通過驗證,如果沒有就讓他跳出,彈出錯誤:

  ... 以上省略

  // 如果缺少資源跳出
  if (sizeof($required) > 0) {
    $json_arr = $this->mod_config->msgResponse((isset($json_arr))?$json_arr:array(), 'error', 'MISSING_DATA', $this->language);
    $json_arr['requred'] = $required;
    return $json_arr;
  }
  
  ... 以下結尾

下一步就是進入資料庫首先透過verifywhere內容:

  ... 以上省略

  // 負責驗證的元素
  $verify = array();
  foreach ($info['verify'] as $key => $value) {
    if (isset($data[$value])) {
      // 驗證是否為編號
      if ($key == '_id') {
          $verify[$key] = new MongoId($data[$value]);
      } else {
          $verify[$key] = $data[$value];
      }
    }
  }
  
  ... 以下結尾

接著再透過我們先前創建的通用Models來確認資料是否存在,並回傳回去輸出內容:

  ... 以上省略

  // 加入邏輯佇列
  $dataQuery['verify'] = $verify;
  $dataQuery['table'] = $table;
  $response = $this->mod_universal->chk_once($dataQuery);
  $json_arr['exist'] = $response;
  $json_arr = $this->mod_config->msgResponse((isset($json_arr))?$json_arr:array(), 'success', 'GET_DATA_SUCCESS', $this->language);
  return $json_arr;
  
  ... 以下結尾

如此一來就完成我們第一個通用功能,完整函式如下:

// 檢查名稱是否存在
function to_work_exist($path_name, $func_name, $data) {
  // 取得table內容
  $methods = $this->config->item('routes_table');
  $table = $methods[$path_name]['table'];
  $info = $methods[$path_name]['detals'][$func_name];

  // 驗證需要的元素
  $required = array();
  foreach ($info['require'] as $keyRequired => $valueRequired) {
    if (!isset($data[$valueRequired])) array_push($required, $valueRequired);
  }

  // 如果缺少資源跳出
  if (sizeof($required) > 0) {
    $json_arr = $this->mod_config->msgResponse((isset($json_arr))?$json_arr:array(), 'error', 'MISSING_DATA', $this->language);
    $json_arr['requred'] = $required;
    return $json_arr;
  }

  // 負責驗證的元素
  $verify = array();
  foreach ($info['verify'] as $key => $value) {
    if (isset($data[$value])) {
      // 驗證是否為編號
      if ($key == '_id') {
          $verify[$key] = new MongoId($data[$value]);
      } else {
          $verify[$key] = $data[$value];
      }
    }
  }
  
  // 加入邏輯佇列
  $dataQuery['verify'] = $verify;
  $dataQuery['table'] = $table;
  $response = $this->mod_universal->chk_once($dataQuery);
  $json_arr['exist'] = $response;
  $json_arr = $this->mod_config->msgResponse((isset($json_arr))?$json_arr:array(), 'success', 'GET_DATA_SUCCESS', $this->language);
  return $json_arr;
}

明天我們再繼續接下去做需要的內容,如果看懂上方函式,也可以舉一反三做下面的內容~

Next station ... RESTful API


上一篇
[Day25] RESTful API Part2
下一篇
[Day27] RESTful API Part4
系列文
你說Codeigniter還能怎麼做?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言