CodeIgniter中的模型/库延迟加载

时间:2013-07-10 19:37:29

标签: php codeigniter

我必须在CodeIgniter中这样做:

$this->load->model('Test_model');
$this->Test_model->....

我只想:

$this->Test_model->...

我不想自动加载所有模型,我想按需加载模型。 如何向CI_Controller添加“延迟加载”逻辑? __get()?我应该添加什么逻辑?

提前致谢!

PS请不要将我的问题与CodeIgniter lazy-loading libraries/models/etc混淆 - 我们有不同的目标。

当前解决方案

更新您的CI_Controller::__construct()(路径system/core/Controller/),例如

foreach (is_loaded() as $var => $class)
{
        $this->$var = '';
        $this->$var =& load_class($class);
}

$this->load = '';
$this->load =& load_class('Loader', 'core');

然后向CI_Controller

添加新方法
public function &__get($name)
{
//code here from @Twisted1919's answer
}

1 个答案:

答案 0 :(得分:3)

以下似乎在ci中不起作用(事实上,魔术方法不起作用),我会留在这里作为对其他人的反思。

嗯,在你的具体情况下,这应该(在你的MY_Controller中):

public function __get($name)
{
    if (!empty($this->$name) && $this->$name instanceof CI_Model) {
        return $this->$name;
    }
    if (is_file(APPPATH.'models/'.$name.'.php')) {
        $this->load->model($name);
        return $this->$name;
    }
}

L.E,第二次尝试:

public function __get($name)
{
    if (isset($this->$name) && $this->$name instanceof CI_Model) {
        return $this->$name;
    }
    if (is_file($modelFile = APPPATH.'models/'.$name.'.php')) {
        require_once ($modelFile);
        return $this->$name = new $name();
    }
}

但是,你需要注意帮助者,图书馆等。