2014-02-09 228 views
0
class Settings extends USER_Controller {...} 

class USER_Controller extends MY_Controller {...}//limit access to user and define some params and functions that is user depended 

class MY_Controller extends CI_Controller {...}//provide extra functionality accross all controllers 

以及如果我嘗試創建3級以上的這不會工作。創建一個核心類,擴展另一個核心類codeigniter

但如果我只是使用​​它會正常工作。

那麼有沒有辦法可以在我的控制器和MY_Controller之間放置一箇中間類 - 擴展CI_Controller的基礎控制器?

+0

你是如何擴展核心類的?你使用了不同的文件嗎? –

+0

即使標記爲重複,這裏所接受的解決方案也遠遠優於「原始」問題中提出的所有其他解決方案。 – Chococroc

回答

3

由於@Minhaz艾哈邁德說,問題是加載類。笨只加載與子類前綴的類,

https://github.com/EllisLab/CodeIgniter/blob/develop/system/core/CodeIgniter.php#L276

if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php')) 
{ 
    require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'; 
} 

一些礦區後,所以我用我的項目都笨鉤spl_​autoload_​register()沒有黑客的解決方案來核心。請按照步驟完成問題中的內容。

  1. 如果配置文件尚未掛鉤,則啓用掛鉤。

  2. 在application/config/hooks.php中創建一個鉤子,如下所示。

    $hook['pre_system'] = array( 'class' => '', 'function' => 'autoload', 'filename' => 'autoload.php', 'filepath' => 'hooks', 'params' => '' );

  3. 創建autoload.phpapplication/hooks文件夾。

  4. autoload.php文件中,

    function autoload() { spl_autoload_register(function($class) { if(strpos($class,'CI_') !== 0 && file_exists(APPPATH.'core/'.$class.EXT)) { require_once APPPATH . 'core/' . $class . EXT; } }); }

就是這樣。

注:在這裏,我用pre_system鉤,不pre_controller,因爲笨加載pre_systempre_controller鉤之間的基本控制器類。

希望這會有所幫助。如果有任何問題,請發表評論。

+0

不錯的代碼,謝謝分享 – Zalaboza

+0

你在CI 3.0.3中試過了嗎?它在CI 3.0.3中不起作用 – Abaij

+0

沒有人..對不起..我與CI沒有聯繫..感動了Laravel;) – IJas

0

您可以使用菲爾的核心解決方案,它的簡單和容易。

http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY

+0

Whith Phil解決方案,您只能定義一個自動加載。檢查http://php.net//manual/en/function.spl-autoload-register.php – Chococroc

+0

如果你想要另一個核心類,你可以擴展所有的類。所以基於這個基於對象的思想基礎? –

+0

是的,問題不在於擴展它,問題在於如果您的PHP文件沒有通過include/require直接包含在您的代碼中,您的PHP文件如何找到這些類。 __autoload定義瞭如何去做,但是使用spl_autoload_register你可以定義多個函數,以防它找不到自己的代碼,也不包括 – Chococroc

1

發生在MY_Controller.php

MY_Controller.php在/應用/芯端的user_controller類文件/

class MY_Controller extends CI_Controller {...} 
class USER_Controller extends MY_Controller {...} 

現在從您的控制器在控制器中的文件夾,您可以從USER_Controller擴展控制器:

class Settings extends USER_Controller {...} 
0

您可以按照自己想要的方式擴展班級,但問題在於班級正在加載,您必須包含您的Settings班級的USER_Controller。問題不是擴展問題是包含文件,所以你必須找到一種方法來包含第二類。

http://www.php.net/manual/en/function.spl-autoload.php

1

什麼做的最好的工作爲CI 2.1.4:
應用/核心

創建例如:
- base_controller(基本指令,由是CI_Controller延伸)
- admin_controller (從基礎控制器擴展並添加認證指令)


然後使用t下襬在:應用程序/控制器:
例如:
類用戶擴展admin_controller ...