Автозагрузка модели Codeigniter не работает для класса MY_Loader - PullRequest
0 голосов
/ 20 декабря 2018

Я добавил "header_model" в файл autoload.php codeigniter.теперь его:

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

И я также могу успешно использовать $this->header_model в других контроллерах.

Но не могу использовать его в MY_Loader классе, который является расширением CI_Loader.

Пример: контроллер страниц находится в приложении / 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 (находится в приложении / ядре / папке) :

<?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 голосов
/ 20 декабря 2018

Проблема в том, что $this - это два разных объекта в Pages и MY_Loader.

. Автозагрузка классов, включая модели, в контроллере является переменным.Так что $this->->header_model... работает внутри Pages, потому что это контроллер.Но объект $this внутри функции template является экземпляром класса MY_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 обнаружит, что конструктор родительского класса выполнит его автоматически.

...