Как работает кодигнитер?

У меня возникли проблемы с пониманием того, как работает загрузка кода.

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

Во-вторых, вы можете загрузить все встроенные. Но вот мой вопрос: как долго он остается загруженным?

Скажем, я загружаю библиотеку проверки формы в контроллер, затем загружаю модель, могу ли я использовать проверку формы в модели или мне нужно перезагрузить ее снова? Продолжая, скажем, я загружаю представление и другой контроллер, могу ли я использовать проверку формы? Или мне нужно загрузить? После перенаправления? Как насчет того, загружать ли я модель или помощник вместо библиотеки? Скажем, я хочу использовать модель внутри другой модели, где ее загрузить?

Итак, основной вопрос, как долго или скорее, насколько далеко загружается загрузка, прежде чем мне нужно перезагрузить?

Загрузка, как правильно указала @yi_H, длится для всего текущего срока действия сценария. IE, когда вы вызываете метод контроллера, загружается ресурс. Если вы вызываете тот же ресурс внутри другого метода, это больше не доступно.

Это происходит потому, что контроллер инициализируется при каждом запросе, поэтому, когда вы index.php/mycontroller/method1 к index.php/mycontroller/method1 контроллер инициализируется (вы можете активировать журналы и ясно видеть это). В вашем методе вы загружаете, скажем, html-помощник. Если вы затем index.php/mycontroller/method2, к index.php/mycontroller/method2, а также для html-помощника, но вы не загрузили его в этот метод, вы получите ошибку функции, которая не найдена.

Итак, в принципе, если вы хотите, чтобы один и тот же ресурс всегда был доступен, у вас есть 3 варианта:

  1. автозагрузить его в application / config / autoloader.php
  2. загружайте его при каждом запросе, то есть внутри каждого метода, который будет использовать этот ресурс
  3. поместите его внутри конструктора контроллера, чтобы он всегда инициализировался при каждом запросе.

Это более или менее то же самое, что и автозагрузка, за исключением того, что она может работать только для контроллера, в который вы помещаете конструктор, поэтому вы получаете выгоду, когда не хотите, чтобы что-то загружалось в контроллер EACH (например, когда вы используете автозагрузку) но только на нескольких. Чтобы использовать этот последний метод, не забудьте ЗАПИСАТЬ РОДИТЕЛЬНЫЙ КОНСТРУКТОР внутри вашего контроллера (как обычно, с моделями):

 function __construct() { parent::__construct(); $this->load->library('whateveryouwant'); } 

Он остается там до конца времени (то есть, когда ваш скрипт заканчивается и вселенная рушится)

Чтобы загрузить что-то при написании собственной модели или помощника, например:

 $ci = get_instance(); $ci->load->library('user_agent'); $ci->load->database(); 

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