如何在CodeIgniter中销毁和重新加载模型?

时间:2014-01-28 15:36:05

标签: php codeigniter model

假设我的控制器中有一个循环:

$continue = true;
while ($continue == true) {
    $this->load->model('foo');
    $this->foo->doSomething();
    if ($this->foo->someCondition() == true) $continue = false;
    unset($this->foo); //not working
    //if not continue to do it
}

在此while循环中,我需要创建此foo模型的实例,它将继续运行,直到满足某些条件($continue将设置为false

为确保我在此循环中每次都创建foo的实例,我尝试使用unset()方法(或设置$this->foo = null)来销毁foo模型,不幸的是它不起作用(错误消息:Call to a member function doSomething on a non-object

2 个答案:

答案 0 :(得分:2)

CodeIgniter model()核心类的Loader方法仅加载模型 一次

来自 source code

if (in_array($name, $this->_ci_models, TRUE))
{
    return;
}

因此,调用model()方法,不会再次加载模型

这就是您收到错误的原因:Call to a member function doSomething on a non-object

我不确定你到底在寻找什么,但我很确定你需要改变你的逻辑。

答案 1 :(得分:0)

通常这不是问题,因为CI使用模型作为静态类,但是在单元测试时我发现如果我创建模型方法的模拟,我需要在之后重新加载模型。

首先,在文件application / core / MY_Loader.php中使用MY_Loader扩展CI_Loaded

class MY_Loader extends CI_Loader
{

    /**
     * Returns true if the model with the given name is loaded; false otherwise.
     *
     * @param $name
     * @return bool
     */
    public function is_model_loaded($name): bool
    {
        return in_array($name, $this->_ci_models, TRUE);
    }

    /**
     * removes the model from the list of models
     * @param $model
     */
    public function unload_model($model)
    {
        if ($this->is_model_loaded($model))
        {
            $this->_ci_models = array_diff($this->_ci_models, array($model));
        }
    }
}

之后,在单元测试代码中,您可以取消设置CI模型。通过从_ci_models数组中删除它,CI在尝试加载时将无法找到它。 因此,单元测试设置如下所示:

public function setUp()
{
    $this->CI = &get_instance();
    $this->CI->assets_model=NULL;
    unset($this->CI->assets_model);
    $this->CI->unload_model('assets_model');
    $this->CI->load->model('misc/Assets_model');
}