0

我必须在 CodeIgniter 中这样做:

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

我只想:

$this->Test_model->...

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

提前致谢!

PS 请不要将我的问题与CodeIgniter 延迟加载库/模型/等混淆- 我们有不同的目标。

当前解决方案

更新你的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
}
4

1 回答 1

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;
    }
}

LE,第二次尝试:

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();
    }
}

但是,您还需要注意帮助程序、库等。

于 2013-07-10T19:52:39.510 回答