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

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