Хуки — Расширение ядра
Технология хуков в CI позволяет вам изменять ход работы фреймворка без изменения файлов ядра. Когда CodeIgniter запускается, происходят вызовы, нарисованные на схеме на странице Ход выполнения приложения. Однако, может возникнуть такая ситуация что вы захотите что-то изменить в этой цепочке на этапе ее выполнения. Например, вы можете захотеть вызвать какой-то скрипт прямо перед загрузкой контроллера или сразу после загрузки.
Подключение хуков
Система хуков может быть включена/выключена глобально, просто в файле application/config/config.php необходимо найти строку:
$config['enable_hooks'] = TRUE;
Объявление хуков
Хуки создаются в файле application/config/hooks.php. Каждый хук определяется как массив по этому шаблону:
$hook['pre_controller'] = array(
'class' => 'MyClass',
'function' => 'Myfunction',
'filename' => 'Myclass.php',
'filepath' => 'hooks',
'params' => array('beer', 'wine', 'snacks')
);
Замечания:
Индекс массива говорит о том, каким хуком вы хотите воспользоваться.
В приведенном выше примере устанавливается хук типа pre_controller. Список допустимых хуков находится ниже.
Следующие пункты должны быть определены в ваших массивах:
- class Название класса, который бы вы хотели использовать. Если вы предпочитаете использовать функцию, а не класс, то оставьте этот пункт пустым.
- function Имя функции, которую необходимо вызвать.
- filename Имя файла, содержащее эту функцию/класс.
- filepath Имя папки, содержащей файл. Замечание: Ваш скрипт обязательно должен находиться ВНУТРИ папки application, поэтому путь надо указать относительно этой папки. Например, если ваш скрипт расположен в application/hooks, можно написать просто hooks в этом элементе массива. Если скрипт лежит в application/hooks/utilities, то необходимо указать здесь hooks/utilities. Без слешей по краям.
- params Любые параметры, которые вы хотите передать в скрипт. Этот пункт опционален.
Несколько вызовов хука одного типа
Если хотите несколько раз использовать хуки одного типа — просто сделайте ваш массив многомерным:
$hook['pre_controller'][] = array(
'class' => 'MyClass',
'function' => 'Myfunction',
'filename' => 'Myclass.php',
'filepath' => 'hooks',
'params' => array('beer', 'wine', 'snacks')
);
$hook['pre_controller'][] = array(
'class' => 'MyOtherClass',
'function' => 'MyOtherfunction',
'filename' => 'Myotherclass.php',
'filepath' => 'hooks',
'params' => array('red', 'yellow', 'blue')
);
В этом помогут пустые скобки после ключа массива:
$hook['pre_controller'][]
Это позволит использовать сразу несколько хуков последовательно. Они будут вызваны в таком порядке, в каком вы их объявили.
Точки хуков
Ниже приведен список доступных типов хуков- pre_system
Вызывается при самом старте системы. Только базовый класс и класс хуков загружены на этот момент. Ни роутинга, ни других процессов маршрутизации еще не произошло. - pre_controller
Вызывается непосредственно перед вызовом ваших контроллеров. Все базовые классы, роутинг и безопасность уже выполнились. - post_controller_constructor
Вызывается сразу после обработки контроллера, но до вызова каких-либо функций внутри него. - post_controller
Вызывается после полного выполнения контроллера. - display_override
Заменяет функцию _display() которая используется для отправки браузеру результата работы контроллера. Это позволяет использовать вам собственные методы для отображения. Заметим, что окончательные данные можно будет получить вызвав $this->output->get_output(). - cache_override
Позволяет использовать собственную функцию, вместо функции _display_cache() выводящего класса. Это позволяет вам использовать собственный механизм кеширования. - scaffolding_override
Вызывается при запросе отображения скаффолдинга, позволяя вам заменить его. - post_system
Вызывается после окончательного сбора страницы. После выполнения готовые данные отправляются в браузер.