Codeigniter框架提供了實現多個應用Application的方法,如參考資料[2]中描述的,這種方法實際上是在網站目錄下存在多個入口文件和Application文件夾的方式。這種方式實現有個缺點,加入我做了一個應用放在Application下,同時為這個應用做了一個后台放在Admin文件夾下,實際上Model里的模塊是可以共用的,但是使用這種方式卻不得不將Model做一份拷貝,當然我們也可以使用軟鏈的方式來避免硬拷貝,但是用起來總是不爽。
所以一般我在開發后台的時候,喜歡在 controller 目錄下建立一個單獨的后台文件夾,例如 controller/admin/,這樣就可以實現Model的共用。Controller中的文件需要一些公共的方法,在Codeigniter中,當我們需要在所有的控制器Controller中添加一些公共方法時,可以考慮對Controller進行擴展。例如用戶登錄的檢查函數,具體的方法我們可以參考[1]中的描述。如果我的前台頁面不需要檢查登錄,后台頁面需要檢查登錄,使用這種方法就會有問題。那么我們能不能定義兩個可被繼承的Controller呢,例如一個叫做My_Controller一個叫做My_AdminController,很可惜的是不行。
擴展核心類的實現代碼,位於System/Core/Codeigniter.php的第214行,代碼如下:
1: if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller'.EXT))
2: {
3: require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller'.EXT;
4: }
由此可見,我們無法定義一個MY_Controller給前台調用,一個MY_AdminController給后台調用。
在這里只好使用一種變通的方法,通過url的segment來判斷,代碼如下:
1: class MY_Controller extends CI_Controller {
2: function __construct(){
3: parent::__construct();
4: if( $this->uri->segment(1) === 'admin' ){
5: ...
6: }
7: }
8: }
希望在Codeigniter的3.0版本中能夠有些改善。
適用的Codeigniter版本:2.0及以上。
參考資料:
1、Extending Codigniter's Controller