Хуки - расширяем ядро фреймворка
Хуки 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/, так что путь к файлу задается относительно этого каталога. Например, если ваш скрипт находится в application/hooks/, просто используйте ‘хук’ как путь к файлу. Если скрипт находится в application/hooks/utilities/ используйте ‘hooks/utilities’ как путь к файлу. Без слэша.
- params любые параметры, которые хотите передать в скрипт. Этот пункт является необязательным.
Если вы работаете с PHP 5.3+, также можете использовать lambda/anoymous функции (или замыкания) как хуки, с простым синтаксисом:
$hook['post_controller'] = function()
{
/* тут что-то делаем */
};
Несколько вызовов одного хука
Если хотите использовать один и тот же хук для более чем одного скрипта, просто сделайте массив многомерным:
$hook['pre_controller'][] = array(
'class' => 'MyClass',
'function' => 'MyMethod',
'filename' => 'Myclass.php',
'filepath' => 'hooks',
'params' => array('beer', 'wine', 'snacks')
);
$hook['pre_controller'][] = array(
'class' => 'MyOtherClass',
'function' => 'MyOtherMethod',
'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() метод, используемый для отправки доработанного текста страницы в веб-браузер в конце выполнения системы. Это позволяет Вам использовать свою собственную методологию отображения. Обратите внимание, что Вам потребуется справка CI $this->CI =& get_instance() и затем окончательные данные будут доступны вызовами $this->CI->output->get_output().
- cache_override Позволяет вызвать свой метод вместо _display_cache() метода в библиотеке отображений. Это позволяет Вам использовать свой собственный механизм кэша отображений.
- post_system Вызывается после отправки финальной страницы в браузер, в конце системы выполнения, когда окончательные данные отправленны в браузер.