我一直在尝试覆盖加载器类(CI_Loader)的“数据库”方法。我按照CodeIgniter用户指南中的说明进行操作:Creating Libraries(滚动到“扩展本机库”)。但MY_Loader类不会自动加载,并且不会在$this->load
调用中用于代替CI核心Loader类。
我只创建了MY_Loader类(用户指南中指定的application / libraries / MY_Loader.php)。有什么我想念的吗?
我已经尝试将它放在config / autoload.php中,用于该文件的libraries部分,它确实是自动加载的,但后来我使用$this->my_loader->database()
访问该库,这不是主意...
我粘贴在application / libraries / 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;
}
}
非常感谢。
答案 0 :(得分:10)
loader类是核心的一部分,因此它需要进入“application / core / MY_Loader.php”
您要扩展的任何类都应该放在您的应用程序文件夹中的相应目录中。你应该能够把你写的课,放在那里,并预先......它应该工作。不需要黑客攻击。
答案 1 :(得分: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();
}
}
如果您有更好/更智能的解决方案,请发布答案。感谢。