Хуки — расширение ядра фреймворка
Хуки CodeIgniter предоставляют возможности изменить внутреннюю работу фреймворка без вмешательства в файлы ядра. Когда работает 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, поэтому указывайте относительный путь. Без ведущего слеша.
- 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(), используемую для отправки финализированной страницы в веб-браузер, при завершении выполнения системы. Это позволяет вам использовать собственную методологию вывода. Помните, что вы должны ссылаться на суперобъект CodeIgniter $this->CI =& get_instance() и после этого финализированные данные будут доступны через $this->CI->output->get_output() - cache_override
Позволяет вам вызывать ваши собственные функции вместо функции _display_cache() класса вывода. Это дает вам возможность использовать собственные механизм кеширования. - post_system
Вызывается после того, как финализированные данные отправлены в браузер, при завершении работы системы.