Codeigniter 模型自动加载不适用于 MY_Loader class

Codeigniter Model autoloading not working for MY_Loader class

我已经将 "header_model" 添加到 codeigniter 的 autoload.php 文件中。现在是:

$autoload['model'] = array("header_model");

而且我也可以在其他控制器中成功使用$this->header_model

但不能在 MY_Loader class 中使用,它是 CI_Loader.

的扩展

示例: 页面控制器 位于 application/controllers/:

class Pages extends CI_Controller {

    public function view($page = 'home')
    {
      var_dump($this->header_model->get_menus()); //echoes data from database.
    }

}

MY_Loader class (位于application/core/文件夹):

<?php
   class MY_Loader extends CI_Loader {

   function __construct()
   {
       parent::__construct();
   }

   public function template($template_name, $vars = array(), $return = FALSE)
   {

       $menuArray = $this->header_model->get_menus(); //echoes errors
       //like: Undefined property: MY_Loader::$header_model
       $vars["menuArray"] = $menuArray;
   }
}

感谢您的帮助。

问题是 $thisPagesMY_Loader 中的两个不同对象。

Autoloaded classes,包括模型,最终成为控制器中的变量。所以 $this->->header_model...Pages 中工作,因为它是一个控制器。但是函数template中的对象$thisMY_Loaderclass的实例。并且 class 没有名为 header_model.

的变量

为了引用控制器使用 get_instance()。方法如下

public function template($template_name, $vars = array(), $return = FALSE)
{

    $CI =& get_instance();
    $menuArray = $CI->header_model->get_menus(); //echoes errors
    //like: Undefined property: MY_Loader::$header_model
    $vars["menuArray"] = $menuArray;
}

不是您的问题的一部分,但我想指出您不需要 MY_Model 中的 __construct() 函数。如果子 class 不在构造函数中进行任何初始化,则无需创建仅调用 parent::__construct(); 的构造函数。 PHP 会找到父 class 构造函数自动执行它。