【译】CodeIgniter HMVC模块扩展使用文档
CodeIgniter HMVC擴(kuò)展說明
原文地址:Modular Extensions - HMVC
模塊擴(kuò)展——HMVC
模塊擴(kuò)展讓CodeIgniter框架模塊化。模塊是一組獨(dú)立的組件(通常有模型、控制器和視圖),它們被分類在應(yīng)用模塊的子文件夾中,并且能夠直接拖到其他的CodeIgniter應(yīng)用中。
HMVC的意思是分層模型視圖控制器。
模塊控制器能夠作為普通的控制器或者HMVC控制器使用,它們也能夠被當(dāng)做小部件幫助你開發(fā)一部分視圖。
模塊擴(kuò)展安裝
安裝純凈的CI框架
設(shè)置$config['base_url']變量
訪問URL /index.php/welcome看到歡迎界面
將模塊擴(kuò)展的third_party文件拖入application/third_party目錄
將模塊擴(kuò)展的core文件放入application/core目錄,MY_Controller.php文件可以不放進(jìn)去,除非你想自己寫一個(gè)你自己的控制器繼承
訪問URL /index.php/welcome看到歡迎界面
創(chuàng)造模塊目錄結(jié)構(gòu)application/modules/welcome/controllers
將控制器文件application/controllers/welcome.php移動(dòng)至application/modules/welcome/controllers/welcome.php
訪問URL /index.php/welcome看到歡迎界面
創(chuàng)建目錄application/modules/welcome/views
11. 將視圖文件application/views/welcome_message.php移動(dòng)至application/modules/welcome/views/welcome_message.php
12. 訪問URL /index.php/welcome看到歡迎界面
你現(xiàn)在應(yīng)該擁有了一個(gè)正在運(yùn)行的模塊擴(kuò)展了。
譯者注:
為了便于大家理解HMVC,我這里展示使用HMVC前和使用HMVC后的目錄結(jié)構(gòu)
使用HMVC前:
使用HMVC后:
安裝提示
第1~3步告訴你如何安裝一個(gè)標(biāo)準(zhǔn)的CI框架,如果你已經(jīng)安裝了,跳至步驟4
第4~5步告訴你普通的CI框架在安裝了MX之后仍然正常運(yùn)行,它不應(yīng)該打斷正常的CI框架安裝
第6~8步說明MX和CI控制器一起正常工作,控制器被移入welcome模塊,視圖文件仍在CI的application/views目錄,MX能夠在好幾個(gè)地方發(fā)現(xiàn)模塊資源,包括應(yīng)用目錄
第9~11步說明MX和在welcome模塊中的控制器以及視圖一起工作,在application/controllers以及application/views目錄中此時(shí)應(yīng)該沒有文件了。
FAQ
Q: 什么是模塊?我為什么要使用他們?
A: 參見維基百科:
http://en.wikipedia.org/wiki/Module)
http://en.wikipedia.org/wiki/Modular_programming)
http://blog.fedecarg.com/2008/06/28/a-modular-approach-to-web-development)
Q: 什么是模塊化HMVC,為什么我應(yīng)該使用它?
A: 模塊化 HMVC = Multiple MVC triads
當(dāng)你需要載入視圖和視圖中的數(shù)據(jù)的時(shí)候,這將是非常有用的??紤]添加一個(gè)購物車到一個(gè)頁面中,這個(gè)購物車需要它自己的控制器,這個(gè)控制器要調(diào)用一個(gè)模型來獲取購物車數(shù)據(jù)。然后控制器需要將數(shù)據(jù)載入到視圖中。因此,和在主控制器處理這個(gè)頁面和購物車不同,購物車MVC能夠直接在頁面中加載。這個(gè)主控制器不需要知道購物車MVC,并且和購物車MVC是完全隔離的。
在CI框架中,我們不能夠在一次請求中調(diào)用多個(gè)控制器。因此,為了實(shí)現(xiàn)HMVC,我們不得不模擬控制器的行為。這用類庫可以做到或者使用這個(gè)“模塊擴(kuò)展HMVC”。
使用一個(gè)類庫和一個(gè)“模塊擴(kuò)展HMVC”類不同之處在于:
不需要在HMVC中獲取和使用CI實(shí)例
HMVC類存儲在modules目錄中而不是類庫目錄中
Q: 模塊擴(kuò)展HMVC和模塊分離是一樣的么?
A: 是,也可以說不是。和模塊分離類似,模塊擴(kuò)展使得模塊變得“可便攜的”。例如,如果你有一個(gè)漂亮的自包含MVC文件集,你能夠?qū)⒛愕腗VC文件加入到另一個(gè)項(xiàng)目中,僅僅通過復(fù)制一個(gè)目錄就行了。所有文件都在同一個(gè)地方而不是散布在model、view 和controller文件夾。
模塊化HMVC意味著模塊化MVC triads。 模塊分離和模塊擴(kuò)展讓相關(guān)的控制器、模型、類庫、視圖等等文件能夠被打包在模塊子目錄中,并且能夠像一個(gè)小型應(yīng)用那樣使用。但是,模塊擴(kuò)展更進(jìn)一步,它允許這些模塊互相通信。你能夠不用通過與http交互得到控制器的輸出內(nèi)容。
特點(diǎn)
所有的控制器都包含一個(gè)$autoload類變量,這個(gè)類變量擁有一個(gè)運(yùn)行時(shí)優(yōu)先載入的條目(item)數(shù)組。這個(gè)功能能夠和 module/config/autoload.php一起使用,然而,使用$autoload變量僅僅在對應(yīng)的控制器中起作用。
<?php class Xyz extends MX_Controller {$autoload = array('helper' => array('url', 'form'),'libraries' => array('email'),); }Modules::$locations可以在application/config.php文件中設(shè)置,例如:
<?php $config['modules_locations'] = array(APPPATH.'modules/' => '../modules/', );Modules::run()輸出將會(huì)被緩存,因此從任何從控制器返回或者輸出的數(shù)據(jù)將會(huì)被捕獲并且返回到調(diào)用者。特別的,$this->load->view()能夠在一個(gè)普通的控制器中按照你所想的那樣使用,而不用返回任何值。
控制器能夠作為別的控制器的類變量載入,使用語句$this->load->module('module/controller');或者在控制器的名稱和模塊的名稱一致的時(shí)候,使用$this->load->module('module');
任何加載的模塊都可以當(dāng)做一個(gè)類庫使用,例如$this->controller->method(),但是加載的模塊擁有自己獨(dú)立與調(diào)用它的類的模塊和類庫。
所有模塊控制器都能夠通過URL( module/controller/method或者模塊名和控制器名稱一致的時(shí)候使用module/method)訪問到。如果你添加了_remap()方法到你的控制器中,你能夠阻止不需要的訪問然后重定向或者發(fā)送一個(gè)錯(cuò)誤,這些隨你。
注意:
要使用HMVC功能,例如Modules::run(),控制器必須繼承MX_Controller類。
僅僅使用分開的模塊而不是HMVC功能,控制器可以繼承CodeIgniter類。
你必須在控制器中使用PHP5樣式的構(gòu)造函數(shù),例如:
<?php class Xyz extends MX_Controller {function __construct(){parent::__construct();} }構(gòu)造函數(shù)并不是必須的,除非你想在控制器創(chuàng)建的時(shí)候載入或者處理什么東西。
所有的MY_extension類庫應(yīng)該包含(需要)他們同等的MX類庫文件,并且繼承它們同等的MX_class。
每一個(gè)模塊可以包含一個(gè)config/routes.php文件,在文件中定義該模塊的路由和默認(rèn)控制器:
<?php $route['module_name'] = 'controller_name';控制器可以從application/controllers子目錄中載入。
控制器也可以從module/controllers子目錄中載入。
資源能夠能夠跨控制器載入,例如: $this->load->model('module/model');
Modules::run()被設(shè)計(jì)成返回部分視圖,并且它將會(huì)從控制器返回緩存輸出(一個(gè)視圖)。使用modules::run語法是一個(gè)URI類型的片段字符串和無限的變量。
<?php /** module and controller names are different, you must include the method name also, including 'index' **/ modules::run('module/controller/method', $params, $...);/** module and controller names are the same but the method is not 'index' **/ modules::run('module/method', $params, $...);/** module and controller names are the same and the method is 'index' **/ modules::run('module', $params, $...);/** Parameters are optional, You may pass any number of parameters. **/在控制器里邊調(diào)用一個(gè)模塊控制器,你可以使用$this->load->module()或者M(jìn)odules::load(),PHP5的方法鏈也可以用在任何被MX加載的對象中,例如: $this->load->library(‘validation’)->run()。
載入模塊的語言文件推薦使用載入方法,該方法將會(huì)傳遞一個(gè)激活的模塊名稱到一個(gè)語言實(shí)例,例如:$this->load->language('language_file');
PHP5的spl_autoload特性允許你自由地?cái)U(kuò)展你的控制器、模塊和來自application/core或者application/libraries基本類的的類庫,不需要考慮顯式包含他們。
類庫加載器也被更新從而適應(yīng)一些CI的特性,例如:類庫別名能夠和模塊別名一樣的方式接受,并且從模塊配置目錄中載入配置文件作為類庫的參數(shù)(例如:form_validation.php),這項(xiàng)特性也被加了進(jìn)來。
$config = $this->load->config(‘config_file’),返回已加載的數(shù)組到變量中。
模塊和類庫也能夠從他們各自的應(yīng)用目錄的子目錄中加載。
在用MX使用表單驗(yàn)證時(shí),你將需要繼承CI_Form_validation類,如下所示:
<?php /** application/libraries/MY_Form_validation **/ class MY_Form_validation extends CI_Form_validation {public $CI; }在將目前的控制器作為$CI變量賦值給表單驗(yàn)證類庫之前。這將讓你的回調(diào)函數(shù)正常工作。
<?php class Xyz extends MX_Controller {function __construct(){parent::__construct();$this->load->library('form_validation');$this->form_validation->CI =& $this;} }部分視圖
使用模塊作為視圖的一部分在一個(gè)視圖中使用是很容易的:
<?php echo Modules::run('module/controller/method', $param, $...); ?>總結(jié)
以上是生活随笔為你收集整理的【译】CodeIgniter HMVC模块扩展使用文档的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 泛型实现List(ListT)排序
- 下一篇: JS组件系列——Bootstrap Ta