Hooks: Estendendo o framework

Hooks: Estendendo o framework

12/07/2016 1 Por Jonathan Lamim

Os hooks são a maneira mais fácil de você extender o framework sem alterar os arquivos de Core. Através dos hooks você pode criar rotinas para serem executadas antes do carregamento do sistema, antes do carregamento de um controller, após a renderização de uma página, ou seja, dentro do fluxo de execução do CodeIgniter.

Os hooks podem ser criados para serem executados nos seguintes pontos do fluxo:

  • pre_system: antes do sistema ser completamente carregado
  • pre_controller: imediatamente após o controller ser chamado, antes de sua execução
  • post_controller_constructor: logo após o método construtor do controller ser executado
  • post_controller: imediatamente após o controller ser chamado
  • display_override: substitui o método _display(), responsável por enviar a página finalizada para o browser, por outra rotina de exibição
  • cache_override: substitui o método _display_cache(), permitindo que seja utilizada outra rotina
  • post_system: chamado imediatamente após a renderização da página no browser

Ativando os hooks

Para ativar os hooks basta acessar o arquivo application/config/config.php e alterar o valor da variável $config['enable_hooks'] para TRUE. Feito isso o CodeIgniter passará a verificar os hooks configurados enquanto o sistema estiver sendo utilizado.

Definindo os hooks

A definição dos hooks é feita no arquivo application/config/hooks.php. Esse arquivo é parecido com o config.php, onde a variável principal é do tipo array.

Para definir um hook você precisa passar 5 informações:

  • class: nome da classe que contém a rotina a ser executada (não é obrigatório, pois você não precisa ter uma classe para criar uma função)
  • function: função responsável pela execução da rotina
  • filename: nome do arquivo onde estão a classe e a função definidas anteriormente
  • filepath: caminho do arquivo (geralmente ficam armazenados em applications/hooks)
  • params: parâmetros necessários para a execução

Veja a seguir um exemplo de como é feita a definição de um hook:

$hook['pre_controller'] = array(
        'class'    => 'NomeClasse',
        'function' => 'NomeFuncao',
        'filename' => 'SuaClasse.php',
        'filepath' => 'path/do/arquivo/da/classe',
        'params'   => array('parametros','necessarios')
);

Repare que foi utilizada uma variável $hook, que é um array, e a chave utilizada foi o ponto de fluxo em que o hook deve ser executado, e no caso do código acima foi utilizado o pre_controller. Se quisesse executar antes da execução completa do sistema bastaria utilizar pre_system.

Caso precise utilizar mais de um hook para o mesmo ponto de fluxo, basta criar as chamadas usando $hook['pre_controller'] como um array multidimensional.

$hook['pre_controller'][] = array(
        'class'    => 'NomeClasse',
        'function' => 'NomeFuncao',
        'filename' => 'SuaClasse.php',
        'filepath' => 'path/do/arquivo/da/classe',
        'params'   => array('parametros','necessarios')
);

$hook['pre_controller'][] = array(
        'class'    => 'NomeClasseB',
        'function' => 'NomeFuncaoB',
        'filename' => 'SuaClasseB.php',
        'filepath' => 'path/do/arquivo/da/classeB',
        'params' => array('parametros','necessarios')
);

Utilidade dos hooks

Os hooks são úteis para diversas operações, como por exemplo:

  • minificação do código HTML da view
  • verificação de sessões
  • criação de logs
  • criação de cache
  • personalização da renderização da view

Viu como é fácil trabalhar com hooks e estender o framework sem precisar alterar os arquivos do Core e ter problemas para atualizar a versão do CodeIgniter para uma mais recente depois?

Aproveite esse conhecimento adquirido e melhore ainda mais o fluxo de execução das tarefas do seu sistema.

Até o próximo artigo!