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

时间:2018-12-20 12:45:38

标签: php codeigniter codeigniter-3 autoloader

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

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

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

但是不能在MY_Loader类的扩展类CI_Loader中使用它。

示例: 页面控制器位于应用程序/控制器/

class Pages extends CI_Controller {

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

}

MY_Loader类(位于应用程序/核心/文件夹中)

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

自动加载的类(包括模型)最终成为控制器中的变量。因此$this->->header_model...Pages中可以工作,因为它是控制器。但是函数$this中的对象templateMY_Loader类的实例。而且该类没有名为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;
}

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