Хуки - расширяем ядро фреймворка

Хуки 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 Вызывается после отправки финальной страницы в браузер, в конце системы выполнения, когда окончательные данные отправленны в браузер.