Os Hooks no Codeigniter são uma ótima ferramenta para que você possa modificar o funcionamento do framework sem mexer nos arquivos de core do sistema. Quando o Codeigniter é executado, ele inicia uma série de processos de acordo com o fluxo do aplicativo.

Com os Hooks, é possível criar ações para serem executadas em um estágio específico da aplicação. Um exemplo prático, é caso você queira executar uma ação após o Codeigniter carregar o construtor do controller.
Abaixo listamos todos os processo que podem ser interceptados, e qual o momento que cada é executado:
- pre_system
É chamado bem cedo durante a execução do sistema. Somente algumas configurações de benchmark e hooks foram carregadas neste momento. Nenhum processo de rotas ou outros foi executado.
- pre_controller
Chamado antes de qualquer controller de sua aplicação. Todas as classes de base, rotas e segurança foram executados neste momento.
- post_controller_constructor
Chamado depois do controller ser instanciado. Nenhum método do controller foi executado neste momento.
- post_controller
Chamado após o controller ser executado.
- display_override
Substitui a função _display() do sistema, usado para enviar a página finalizada para o navegador no final da execução do processo. Isso permite que você use a sua metodologia própria de exibição. Note que você vai precisar fazer referência ao superobjeto CI da seguinte maneira: $this->CI =& get_instance(). E depois os dados finalizados estará disponível chamando $this->CI->output->get_output().
- cache_override
Permite que você utilize sua própria função, em vez da _display_cache() na classe de saída. Isso permite que você utilize próprio mecanismo de exibição de cache.
- post_system
Chamado depois que a página final é processada e enviado para o navegador, no final da execução do sistema.
Para definir um novo Hook, vamos usar o arquivo application/config/hooks.php.
Através desse arquivo, vamos criar um array com os valores que desejamos executar.
Abaixo há um exemplo de como criar essa configuração:
$hook['post_controller_constructor'] = array(
'class' => 'MeuHook',
'function' => 'minhaFuncaoHook',
'filename' => 'MeuHook.php',
'filepath' => 'hooks',
'params' => array('cerveja', 'vinha', 'petiscos')
);
Com essa configuração acima, o Codeigniter tentará instanciar a classe MeuHook, no arquivo application/hooks/MeuHook.php, e executar a função minhaFuncaoHook, logo após o construtor do controller ser criado.
Ela pode ser útil para validação de acesso a este controller, por exemplo.
No caso de você desejar executar vários ganchos (Hooks), é só criar essas configurações em um array bidimensional, conforme abaixo:
$hook['post_controller_constructor'][] = array(
'class' => 'MeuHook',
'function' => 'minhaFuncaoHook',
'filename' => 'MeuHook.php',
'filepath' => 'hooks',
'params' => array('cerveja', 'vinha', 'petiscos')
);
$hook['post_controller_constructor'][] = array(
'class' => 'MeuHook',
'function' => 'minhaFuncaoHook2',
'filename' => 'MeuHook.php',
'filepath' => 'hooks'
);
Não esqueça de habilitar os hooks no arquivos de application/config/config.php do CodeIgniter.