Доступ к автозагрузке модели из автозагрузки библиотеки - PullRequest
1 голос
/ 05 января 2012

В моем файле автозагрузки у меня есть несколько общих библиотек и несколько общих автозагрузок:

$autoload['libraries'] = array('database','session','tools','common'....);
$autoload['model'] = array('mauth','madmin',...);

Я вызываю этот код внутри библиотеки, которая вызывает другую библиотеку:

class library1{
  function x(){
    $this->CI =& get_instance();
    $this->CI->library2->y();
  }
}

class library2()
  function y(){
    $this->CI =& get_instance();
    $array_notifications = $this->CI->madmin->getNotifications();
  }
}

И я получаю:

Message: Undefined property: Splash::$madmin

Полагаю, я могу сделать это:

$this->CI->load->model('madmin');

Но .. почему? Почему я не могу определить приоритет загрузки моих автозагрузанных классов?

Спасибо

РЕДАКТИРОВАТЬ: Уточнение

Ответы [ 2 ]

2 голосов
/ 05 января 2012

AFAIK, нет возможности выбрать приоритет загрузки, и я думаю, что взломать ядро ​​просто, чтобы избежать написания строки, немного ... выключено.

Мне пришлось искать основную систему, чтобы лучше понять, как все работает. Похоже, библиотеки загружаются перед моделями, поэтому вы правы, когда говорите, что вам нужно загрузить модель перед вызовом одного из ее методов (хотя я не проверял, но думаю, что это работает так).

Я не знаю, почему это делается, но пока единственное решение, которое я вижу, это изменить себя в порядке загрузки, но я предупреждаю вас: я думаю, что если все работает таким образом, есть причина для КИ разработчики подумали; это может иметь недостатки, которые вы не можете сказать, поэтому всегда будьте готовы к недостатку в случае, если вы обнаружите проблемы. Это решение является немного спекулятивным и не гарантировано, я буду признателен за ваш отзыв, поскольку я не могу сейчас создать среду тестирования, чтобы доказать это

Перейдите к файлу system/core/loader.php около строки 1166 (метод _ci_autoloader()), где проверяется индекс «библиотеки» массива $autoload, и поменяйте его позицию проверкой индекса «модели», которая находится около строка 1183.

И удачи:)

1 голос
/ 05 января 2012

Я лично считаю, что вам следует избегать автоматической загрузки в максимально возможной степени, поскольку все ресурсы останутся загруженными независимо от того, используете вы их или нет, как сказано здесь .

Кроме того, помните, что модельавтозагрузка работает несколько иначе, чем автозагрузка для других объектов.

При работе с моделями CI предполагает, что любая загруженная библиотека также доступна внутри модели.Таким образом, загрузка библиотек до моделей на самом деле является правильным решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...