2011-03-26 125 views
4

我一直在試圖覆蓋加載器類(CI_Loader)的「數據庫」方法。我遵循CodeIgniter用戶指南上的說明:Creating Libraries(滾動到「擴展本機庫」)。但MY_Loader類不會自動加載,並且不會在$this->load調用中用於代替CI core加載程序類。 我只創建了MY_Loader類(application/libraries/MY_Loader.php,如用戶指南中所述)。有什麼我失蹤? 我試圖把它的config/autoload.php該文件的庫部分,它確實自動加載,但後來我可以訪問使用$this->my_loader->database()圖書館,這不是想法...CodeIgniter 2:不加載MY_Loader類

我粘貼在應用程序/庫的內容下面/ MY_Loader.php

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class MY_Loader extends CI_Loader { 

    function database($params = '', $return = FALSE, $active_record = NULL) 
    { 
     echo '---test---'; 
     exit; 
    } 
} 

非常感謝。

回答

10

Loader類是核心的一部分,所以它需要在「應用程序/核心/ MY_Loader.php」

希望擴展在您的應用程序文件夾對應的目錄應該去任何類去。你應該能夠把你寫的課程放在那裏,然後放在那裏,它應該可以工作。不需要黑客。

+0

中使用'subclass_prefix'值指定的值作爲前綴,則核心的任何擴展都將由CI引擎處理,謝謝您的工作,就像魅力一樣!用戶指南並不清楚核心類的情況,我也沒有意識到這一點,但它是非常合乎邏輯的。謝謝。 – 2011-03-27 06:32:10

+0

我需要爲我的課前綴「MY_」@GarciaWebDev – ahmad05 2013-11-22 06:41:51

+0

@ ahmad05是的,你是。如果你想改變前綴(不知道爲什麼你會這樣做),你可以改變application/config/config.php中的'subclass_prefix'值爲任何你想象的值 – 2015-01-07 11:15:16

0

好吧,我設法讓它工作,但我不確定它是最好的還是最優雅的方式。 首先,我在庫部分的application/config/autoload.php中添加了「my_loader」。 然後我檢查了什麼$this->load是在控制器內部,它是CI_Loader實例,所以在MY_Loader類的構造函數中,我創建了一個CI引用,並用對MY_Loader的引用替換了它的load屬性:$CI->load = $this;

最後MY_Loader類是這樣的:

class MY_Loader extends CI_Loader { 

    function __construct() { 
     parent::__construct(); 

     $CI =& get_instance(); 
     $CI->load = $this; 
    } 

    function database($params = '', $return = FALSE, $active_record = NULL) 
    { 
     parent::database($params, $return, $active_record); 

     // bootstrap doctrine 
     require_once APPPATH . DIRECTORY_SEPARATOR . 'hooks' . DIRECTORY_SEPARATOR . 'doctrine' . EXT; 
     bootstrap_doctrine(); 
    } 
} 

請,如果你拿出一個更好/更聰明的解決方案,張貼解答。謝謝。

+0

更好的解決方案是Michael Copeland發佈的正確解決方案。如果將文件放在application/core文件夾中,並且在config.php – 2015-01-07 11:17:20