2011-03-26 35 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