php – Codeigniter – 快速自動載入你的 model 與 view 的方法
可以用更方便的方法來操作你的model與view。
Model
1 2 3 4 |
// 可以直接這麼寫, model未加載將自動加載 $this->talk->album_model->getlist(102, 1); |
View
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//直接輸出 $this->talk->view("frontend/header, frontend/main, frontend/footer", $param, false); //組合回傳 $string = $this->talk->view("frontend/header, frontend/main, frontend/footer", $param, true); //php 5.3 後支援 Anonymous callback $addview = " test/header, test/main, test/menu, test/content, test/footer "; Talk::view($addview, $param, function ($string){ echo $string; }); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** * [快速與交談] * * 版本 v1.3 * 快速呼叫你的 model 與 view 。當你需要model的時候,系統發現還沒有引用檔案, * 才會自動利用 $this->load->model() 讀取,效能較佳。 * * * --model 使用方法-- * * 1) * controller 中添加 * $this->load->library('talk'); * * 若要全域添加可以在自訂的 MY_Controller 中使用,或是 confog/autoload.php 中使用自動載入 * $autoload['libraries'] = array('talk'); * * * 2) * 在任何控制器(controller)或視圖(view)中使用你的model * $this->talk->模組名稱->模組方法(); * $this->talk->album_model->getlist(102, 1); 或 * Talk::model("album_model")->getlist(102, 1); * * php 5.3 以後的版本可以這麼寫 * Talk::模組名稱()->模組方法(); * Talk::album_model()->getlist(102, 1); * * * --view 使用方法-- * * $param->header = "標題"; * $param->main = "變化位置"; * $param->footer = "底部"; * * 直接輸出 * $this->talk->view("frontend/header, frontend/main, frontend/footer", $param, false); 或 * Talk::view("frontend/header, frontend/main, frontend/footer", $param, false); * * 組合回傳後輸出 * $result = Talk::view("frontend/header, frontend/main, frontend/footer", $param, true); * echo $result; * * php 5.3 後支援 Anonymous callback * Talk::view("test/header, test/main, test/footer", $param, function ($string) * { * echo $string; * }); * * */ class Talk { //5.2以前,把model當作屬性使用,如 $talk->album_model->getlist(103, 1); //與 __call 同,為了風格一致,使用屬性呼叫model不建議使用。 function __get($name) { return self::comm("model", $name); } //5.2以前,把model當作方法使用,如 $talk->album_model()->getlist(103, 1); public function __call($name, $arguments) { return self::comm("model", $name); } //5.3以後可使用靜態方法如 talk::album_model()->getlist(102, 1); public static function __callStatic($name, $arguments) { return self::comm("model", $name); } //溝通方式 protected function comm($type, $name) { $CI =& get_instance(); $name = strtolower($name); if ($type == "model") { $CI->load->model($name); } return $CI->$name; } //讀取模組的方法 public function model($name) { $CI =& get_instance(); $CI->load->model($name); return $CI->$name; } //讀取視圖的方法 public function view() { $CI =& get_instance(); $param = func_get_args(); //若第一個參數是字串, 第二個參數就是傳遞參數, 第三個是是否回傳 $string = trim($param[0], ", "); $data = $param[1]; $third = empty($param[2]) ? false : $param[2]; $viewary = explode(",", $string); foreach ($viewary as $file) { $file = trim($file, " "); //若是布林 if (is_bool($third)) { //若全部回傳,將依序放入陣列 if ($third === true) { $join_ary[] = $CI->load->view($file, $data, true); } //若不是則輸出 else { $CI->load->view($file, $data); } } //若是 callback elseif (!is_bool($third)) { $join_ary[] = $CI->load->view($file, $data, true); } } $join_string = implode(NULL, $join_ary); //回傳組合陣列 if (is_bool($third) and $third === true) { return $join_string; } //callback else { return call_user_func($param[2], $join_string); } //若是 function // call_user_func($param[2], $return_ary); } } /* End of file talk.php */ /* Location: ./application/libraries/talk.php */ |
題外說明為什麼這麼做的想法,是因為普遍會看到使用 __autoload 魔術方法放在 config.php 中來做到快速加載的方法。例如官方使用這種方式
1 2 3 4 |
$this->load->model("post"); $this->post->save(); |
但是php 5 以後都會想要能更快的寫法,例如
1 2 3 4 |
$post = new Post; $post->save(); |
這種方式可以參考:http://code.tutsplus.com/tutorials/6-codeigniter-hacks-for-the-masters–net-8308 但這有個問題就是例如 $post 這個變數是沒辦法在 view 中被引用。除非又添加了
1 2 3 |
$this->post = $post; |
不要懷疑喔,實務上開發有很多時候你直接在 view 中做 model 提取是非常有效益且好懂、好整理的。如果硬要把model 放在 controller,某些時候你的程式碼會又臭又長又難維護喔。趕快試試吧!
Dimo
2014-10-14 - 19:47
$psot = new Post;這行
似乎是$post?
jsn
2014-10-14 - 22:07
對喔~感謝您的提醒~