如何改寫核心元件 CI_Model - CodeIgniter
2013 Mar 23 未分類
(這篇欠超久)
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 應該可以少很多
製作時間也可以縮短
真是一整個歡樂
結論
其實一個系統好好研究
可以改良的地方真的很多
別小看這些小動作
節省時間 提昇效率 減少錯誤
就可以賺更多錢
0則留言