Search code examples
phpcodeignitercodeigniter-3autoloader

Codeigniter Model autoloading not working for MY_Loader class


I've added "header_model" into codeigniter's autoload.php file. now its:

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

And i also can successfully use $this->header_model in other controllers.

But can't use it in MY_Loader class, which is extension of CI_Loader.

Example: Pages controller located at 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 (located at application/core/ folder):

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

Thanks for any help.


Solution

  • The problem is that $this is two different objects in Pages and MY_Loader.

    Autoloaded classes, including models, wind up being variables in the controller. So $this->->header_model... works within Pages because it is a controller. But the object $this inside the function template is the instance of the MY_Loader class. And that class has no variable called header_model.

    In order to reference the controller use get_instance(). Here's how

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

    Not part of your problem but I'd like to point out that you do not need the __construct() function in MY_Model. If a child class does not do any initialization in a constructor there is no need to create a constructor only to call parent::__construct();. PHP will find the parent class constructor execute it automatically.