Hooki - Rozszerzanie frameworka
Hooki w CodeIgniter pozwalają na wpięcie się i modyfikację wewnętrznych procesów działania frameworka, bez potrzeby zmieniania plików źródłowych. Kiedy uruchamiany jest CodeIgniter, wykonywane są następuje po sobie procesy, które można zobaczyć na diagramie schematu działanai aplikacji. W określonym momencie wykonywania poszczególnych procesów, mamy możliwość wykonania naszego własnego kodu. Dla przykładu, możemy chceć wykonać jakiś skrypt zaraz przed/po tym jak załadowany zostanie kontroler lub wykonać skrypt, który znajduje się w innej lokalizacji.
Włączanie hooków
Hooki mogą zostać włączone/wyłączone globalnie, poprzez ustawienie następującej opcji w pliku application/config/config.php:
$config['enable_hooks'] = TRUE;
Definiowanie hooka
Definicje hooks znajduja się w pliku application/config/hooks.php file. Każdy hook jest określany za pomocą tablicy, w ten sposób:
$hook['pre_controller'] = array(
'class' => 'MyClass',
'function' => 'Myfunction',
'filename' => 'Myclass.php',
'filepath' => 'hooks',
'params' => array('beer', 'wine', 'snacks')
);
Uwagi:
Indeks tablicy odpowiada konkretnemu hookowi, którego chcesz użyć. W powyższym przykładzie hook wskazuje na pre_controller. Listę dostępnych punktów możesz znaleźć poniżej. W tablicy asocjacyjnej definiującej hook, powinny znaleźć się następujące elementy:
- class Nazwa klasy, którą chcesz wywołać. Jeśli zamiast klasy wolisz użyć funkcji proceduralnej, zostaw to pole puste.
- function Nazwa funkcji, która ma zostać wywołana.
- filename Nazwa pliku, w którym znajduje się Twoja klasa/funkcja.
- filepath Nazwa folderu, w którym znajduje się Twój plik. Uwaga: Twój plik musi się znajdować w WEWNĄTRZ folderu application, dlatego ścieżka jest relatywna to tego katalogu. Dla przykładu, jeśli Twój plik znajduje się w katalogu application/hooks, to użyjesz wartości hooks jako filepath. Jeśli Twój plik znajduje się w application/hooks/utilities, to będzie to wartość hooks/utilities. Bez ukośnika na końcu.
- params Parametry jakie chcesz przypisać do Twojego skryptu. To pole jest opcjonalne.
Wiele odwołań do tego samego hooka
Jeśli chcesz użyć tego samego hooka, z więcej niż jednym skryptem wystarczy, że zadeklaryjesz tablicę jako wielowymiarową, w ten sposób:
$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')
);
Zwróć uwagę na nawias kwadratowy, po każdym indeksie tablicy:
$hook['pre_controller'][]
To pozwala na posiadanie jednego hooku, który wywołuje wiele skryptów. Kolejność wykonywania skryptów, zależy od kolejności ich deklaracji.
Dostępne hooki
Poniżej znajduje się lista dostępnych hooków.
- pre_system
Wywoływany bardzo wcześnie podczas uruchamiania frameworka. Jedynie klasy benchmark i hooks zostały załadowane. Routingu oraz innye czynności nie miały jeszcze miejsca. - pre_controller
Wywoływany bezpośrednio przed uruchomieniem kontrolera. Wszystkie klasy bazowe, routing i kontrola bezpieczeństwa zostały wykonane. - post_controller_constructor
Wywoływany bezpośrednio po tym, jak utworzony zostanie kontroler, ale przed wywołaniem konkretnej jego metody. - post_controller
Wywoływany zaraz po tym jak kontroler zostanie w pełni wykonany. - display_override
Nadpisuje funkcję _display(), która jest używana do wysyłania ukończonej strony bezpośrednio do przeglądarki. To pozwala na użycie Twojej własnej metodologii wyświetlania. Zwróć uwagę, że będziesz musiał zastosować referencję do superobiektu CI ($this->CI =& get_instance()) i dopiero potem będziesz miał dostęp do ukończonych danych za pośrednictwem metody $this->CI->output->get_output() - cache_override
Pozwala na wywołanie Twojej własnej funkcji zamiast _display_cache() w klasie output. Dzięki temu masz możliwość użycia własnego mechanizmu wyświetlania cache. - post_system
Wywoływany po tym jak wyrenderowana strona jest wysyłana do przeglądarki, na końcu działania frameworka.