php – Codeigniter – 快速自動載入你的 model 與 view 的方法
可以用更方便的方法來操作你的model與view。
Model
// 可以直接這麼寫, model未加載將自動加載 $this->talk->album_model->getlist(102, 1);
View
//直接輸出 $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; });
<?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 中來做到快速加載的方法。例如官方使用這種方式
$this->load->model("post"); $this->post->save();
但是php 5 以後都會想要能更快的寫法,例如
$post = new Post; $post->save();
這種方式可以參考:http://code.tutsplus.com/tutorials/6-codeigniter-hacks-for-the-masters–net-8308 但這有個問題就是例如 $post 這個變數是沒辦法在 view 中被引用。除非又添加了
$this->post = $post;
不要懷疑喔,實務上開發有很多時候你直接在 view 中做 model 提取是非常有效益且好懂、好整理的。如果硬要把model 放在 controller,某些時候你的程式碼會又臭又長又難維護喔。趕快試試吧!
Dimo
2014-10-14 - 19:47
$psot = new Post;這行
似乎是$post?
jsn
2014-10-14 - 22:07
對喔~感謝您的提醒~