如何改寫核心元件 CI_Model – CodeIgniter

(這篇欠超久)
CodeIgniter 寫久了
就會發現其實模式很固定

Controller 跟 Model 裡面的 function 大概就那些
用 Copy 的容易發生錯誤

於是就想把它變成 default 的 function
只要把 code 填進去
或是用參數來決定就好

例如 Model 是控制資料庫資料存取的
基本上一定會有
create/select/update/delete 幾個動作

如果能把這些 function 先寫好
在把欄位的部份抽出來變成設定
那就可以少掉很多功夫
debug 也會更方便

改寫的方法如下
首先 先在 application/core 內建立一個 MY_Model.php 的檔案

檔案裡面的內容如下
註: 底下程式直接執行會有一些變數未定義的錯誤
因為我已經把一些設定值拔掉
目的只是純粹表達概念

<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
class MY_Model extends CI_Model
{
public function __construct($config=array())
{
parent::__construct();
}
public function get($idx)
{
$this->db->select('*');
$this->db->where('idx', $idx);
$res       = $this->db->get($this->table);
$item       = $res->row_array();
if(empty($item)) return null;
}
public function insert($data)
{
$this->db->insert($this->table, $data);
$idx       = $this->db->insert_id();
$this->Item_order->update_order_idx($this->table, $idx);
if($this->image_upload)
$this->upload_image($idx);
$this->SEO->update_by_form($this->model_name, $idx);
$this->Modify_history->insert($this->model_name, $idx, 'insert');
return $idx;
}
public function update($idx, $data)
{
$this->db->where('idx', $idx);
$this->db->update($this->table, $data);
if($this->image_upload)
$this->upload_image($idx);
$this->SEO->update_by_form($this->model_name, $idx);
$this->Modify_history->insert($this->model_name, $idx, 'update');
return $idx;
}
public function delete($idx)
{
$this->db->where('idx', $idx);
$this->db->delete($this->table);
}
}
/* End of file MY_Model.php */
/* Location: ./application/core/MY_Model.php */

裡面有一些存取 db 的基本 function
對 db 來說, 可能都會類似像 get 這個 function 一樣
傳入一些固定的值
然後從 db 取值, 或是寫值進去

寫入什麼資料欄位 由外部傳入
重複的部份都放進這個 MY_Model 的 class 裡面

像我有些模組可能需要上傳圖片
寫一些 SEO 資訊
跟記錄這筆資料是誰變更的
這些瑣碎但是固定的事情
都可以移到這層來
以後要修改就不用每個 model 都改
充分發揮物件導向的特性

寫好以後
如果有要繼承這個 base class 的 model
可以這樣寫

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Banner extends MY_Model {
public function __construct()
{
parent::__construct($config);
}
public function insert()
{
$data       = array();
$data['title']     = $this->input->post('title');
$data['link']     = $this->input->post('link');
$idx       = parent::insert($data);
return $idx;
}
public function update($idx)
{
$data       = array();
$data['title']     = $this->input->post('title');
$data['link']     = $this->input->post('link');
$idx       = parent::update($idx, $data);
return $idx;
}
}
/* End of file banner.php */
/* Location: ./application/model/customize/banner.php */

注意
繼承的部份已經從 CI_Model 改成 MY_Model 了
其他寫好就都一樣
寫你想寫的步驟跟流程
但是不一樣的是
這層的 code 就更少了

只要把一些要操作的資料準備好
往 MY_Model 丟就好了

甚至像 get 這種拔辣的 function
根本不用寫
直接用 MY_Model 的 function 就好了

以後新增 model 的時候
copy 的 code 變少了
要改的 code 也少很多

這樣 bug 應該可以少很多
製作時間也可以縮短

真是一整個歡樂

結論
其實一個系統好好研究
可以改良的地方真的很多
別小看這些小動作
節省時間 提昇效率 減少錯誤
就可以賺更多錢