原文地址:Modular Extensions - HMVCphp
模塊擴展讓CodeIgniter框架模塊化。模塊是一組獨立的組件(一般有模型、控制器和視圖),它們被分類在應用模塊的子文件夾中,而且可以直接拖到其餘的CodeIgniter應用中。web
HMVC的意思是分層模型視圖控制器。數組
模塊控制器可以做爲普通的控制器或者HMVC控制器使用,它們也可以被當作小部件幫助你開發一部分視圖。緩存
安裝純淨的CI框架mvc
設置$config['base_url']
變量app
訪問URL /index.php/welcome
看到歡迎界面框架
將模塊擴展的third_party
文件拖入application/third_party
目錄模塊化
將模塊擴展的core
文件放入application/core
目錄,MY_Controller.php
文件能夠不放進去,除非你想本身寫一個你本身的控制器繼承函數
訪問URL /index.php/welcome
看到歡迎界面codeigniter
創造模塊目錄結構application/modules/welcome/controllers
將控制器文件application/controllers/welcome.php
移動至application/modules/welcome/controllers/welcome.php
訪問URL /index.php/welcome
看到歡迎界面
建立目錄application/modules/welcome/views
11. 將視圖文件application/views/welcome_message.php
移動至application/modules/welcome/views/welcome_message.php
12. 訪問URL /index.php/welcome
看到歡迎界面
你如今應該擁有了一個正在運行的模塊擴展了。
譯者注:
爲了便於你們理解HMVC,我這裏展現使用HMVC前和使用HMVC後的目錄結構
使用HMVC前:
使用HMVC後:
第1~3步告訴你如何安裝一個標準的CI框架,若是你已經安裝了,跳至步驟4
第4~5步告訴你普通的CI框架在安裝了MX以後仍然正常運行,它不該該打斷正常的CI框架安裝
第6~8步說明MX和CI控制器一塊兒正常工做,控制器被移入welcome
模塊,視圖文件仍在CI的application/views
目錄,MX可以在好幾個地方發現模塊資源,包括應用目錄
第9~11步說明MX和在welcome
模塊中的控制器以及視圖一塊兒工做,在application/controllers
以及application/views
目錄中此時應該沒有文件了。
Q: 什麼是模塊?我爲何要使用他們?
A: 參見維基百科:
Q: 什麼是模塊化HMVC,爲何我應該使用它?
A: 模塊化 HMVC = Multiple MVC triads
當你須要載入視圖和視圖中的數據的時候,這將是很是有用的。考慮添加一個購物車到一個頁面中,這個購物車須要它本身的控制器,這個控制器要調用一個模型來獲取購物車數據。而後控制器須要將數據載入到視圖中。所以,和在主控制器處理這個頁面和購物車不一樣,購物車MVC可以直接在頁面中加載。這個主控制器不須要知道購物車MVC,而且和購物車MVC是徹底隔離的。
在CI框架中,咱們不可以在一次請求中調用多個控制器。所以,爲了實現HMVC,咱們不得不模擬控制器的行爲。這用類庫能夠作到或者使用這個「模塊擴展HMVC」。
使用一個類庫和一個「模塊擴展HMVC」類不一樣之處在於:
不須要在HMVC中獲取和使用CI實例
HMVC類存儲在modules
目錄中而不是類庫目錄中
Q: 模塊擴展HMVC和模塊分離是同樣的麼?
A: 是,也能夠說不是。和模塊分離相似,模塊擴展使得模塊變得「可便攜的」。例如,若是你有一個漂亮的自包含MVC文件集,你可以將你的MVC文件加入到另外一個項目中,僅僅經過複製一個目錄就好了。全部文件都在同一個地方而不是散佈在model
、view
和controller
文件夾。
模塊化HMVC意味着模塊化MVC triads。 模塊分離和模塊擴展讓相關的控制器、模型、類庫、視圖等等文件可以被打包在模塊子目錄中,而且可以像一個小型應用那樣使用。可是,模塊擴展更進一步,它容許這些模塊互相通訊。你可以不用經過與http交互獲得控制器的輸出內容。
全部的控制器都包含一個$autoload
類變量,這個類變量擁有一個運行時優先載入的條目(item)數組。這個功能可以和 module/config/autoload.php
一塊兒使用,然而,使用$autoload
變量僅僅在對應的控制器中起做用。
<?php class Xyz extends MX_Controller { $autoload = array( 'helper' => array('url', 'form'), 'libraries' => array('email'), ); }
Modules::$locations
能夠在application/config.php
文件中設置,例如:
<?php $config['modules_locations'] = array( APPPATH.'modules/' => '../modules/', );
Modules::run()
輸出將會被緩存,所以從任何從控制器返回或者輸出的數據將會被捕獲而且返回到調用者。特別的,$this->load->view()
可以在一個普通的控制器中按照你所想的那樣使用,而不用返回任何值。
控制器可以做爲別的控制器的類變量載入,使用語句$this->load->module('module/controller');
或者在控制器的名稱和模塊的名稱一致的時候,使用$this->load->module('module');
任何加載的模塊均可以當作一個類庫使用,例如$this->controller->method()
,可是加載的模塊擁有本身獨立與調用它的類的模塊和類庫。
全部模塊控制器都可以經過URL( module/controller/method
或者模塊名和控制器名稱一致的時候使用module/method
)訪問到。若是你添加了_remap()
方法到你的控制器中,你可以阻止不須要的訪問而後重定向或者發送一個錯誤,這些隨你。
要使用HMVC功能,例如Modules::run()
,控制器必須繼承MX_Controller
類。
僅僅使用分開的模塊而不是HMVC功能,控制器能夠繼承CodeIgniter類。
你必須在控制器中使用PHP5樣式的構造函數,例如:
<?php class Xyz extends MX_Controller { function __construct() { parent::__construct(); } }
構造函數並非必須的,除非你想在控制器建立的時候載入或者處理什麼東西。
全部的MY_extension
類庫應該包含(須要)他們同等的MX類庫文件,而且繼承它們同等的MX_class
。
每個模塊能夠包含一個config/routes.php
文件,在文件中定義該模塊的路由和默認控制器:
<?php $route['module_name'] = 'controller_name';
控制器能夠從application/controllers
子目錄中載入。
控制器也能夠從module/controllers
子目錄中載入。
資源可以可以跨控制器載入,例如: $this->load->model('module/model');
Modules::run()
被設計成返回部分視圖,而且它將會從控制器返回緩存輸出(一個視圖)。使用modules::run
語法是一個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. **/
在控制器裏邊調用一個模塊控制器,你可使用$this->load->module()
或者Modules::load()
,PHP5的方法鏈也能夠用在任何被MX加載的對象中,例如: $this->load->library(‘validation’)->run()
。
載入模塊的語言文件推薦使用載入方法,該方法將會傳遞一個激活的模塊名稱到一個語言實例,例如:$this->load->language('language_file');
PHP5的spl_autoload
特性容許你自由地擴展你的控制器、模塊和來自application/core
或者application/libraries
基本類的的類庫,不須要考慮顯式包含他們。
類庫加載器也被更新從而適應一些CI的特性,例如:類庫別名可以和模塊別名同樣的方式接受,而且從模塊配置目錄中載入配置文件做爲類庫的參數(例如:form_validation.php
),這項特性也被加了進來。
$config = $this->load->config(‘config_file’)
,返回已加載的數組到變量中。
模塊和類庫也可以從他們各自的應用目錄的子目錄中加載。
在用MX使用表單驗證時,你將須要繼承CI_Form_validation
類,以下所示:
<?php /** application/libraries/MY_Form_validation **/ class MY_Form_validation extends CI_Form_validation { public $CI; }
在將目前的控制器做爲$CI變量賦值給表單驗證類庫以前。這將讓你的回調函數正常工做。
<?php class Xyz extends MX_Controller { function __construct() { parent::__construct(); $this->load->library('form_validation'); $this->form_validation->CI =& $this; } }
使用模塊做爲視圖的一部分在一個視圖中使用是很容易的:
<?php echo Modules::run('module/controller/method', $param, $...); ?>