Автозагрузка модели Codeigniter не работает для класса MY_Loader

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

$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 класс (находится в папке 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;
   }
}

Спасибо за любую помощь.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
321
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что $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 обнаружит, что конструктор родительского класса выполнит его автоматически.

Сработало, спасибо :)

Nick 20.12.2018 19:08

Другие вопросы по теме