Codeigniter中對核心類的擴展


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

2、Manage Applications

3、Codeigniter extends core class

4、Codeigniter uri

5、Codeigniter 3.0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM