Os Hooks do Kohana PHP são realmente úteis. Demonstrarei como utiliza-los, exemplificando a sua utilização em uma situação real.
O que são Hooks?
Hooks são arquivos que são carregados na inicialização do Kohana, permitindo você adicionar ou modificar funções, chamadas callbacks, que são disparadas pelo Kohana.
Essas funções (ou callbacks) são colocados em uma lista dentro do seu evento específico, chamada Event Queue.
O que são Eventos?
Durante a inicialização, e até mesmo durante a execução, em alguns casos, o núcleo do Kohana dispara vários eventos. Eventos que são definidos pelo próprio núcleo.
Você pode ver a lista completa de eventos disparados pelo Kohana, na documentação: http://docs.kohanaphp.com/general/events
Habilitando os Hooks no Kohana
Para começar a brincar com os Hooks, é necessário habilitá-los. Para isso, basta configurar a opção enable_hooks no config/config.php, para TRUE:
$config['enable_hooks'] = TRUE;
Exemplo de utilização de Hooks
Suponha que tenhamos um site com sistema de autenticação.
Quando um visitante chega, ele é logo direcionado ao controller padrão, definido em config/routes.php, pela seguinte linha:
$config['_default'] = 'site';
O controller site, contém os métodos (páginas): Home (com formulário de autenticação), Quem Somos, Ajuda…
Agora, o que fazer quando este visitante já estava autenticado anteriormente, e retorna ao site?
A solução mais simples a se fazer, é criar uma verificação no controller site, e caso o usuário já esteja autenticado ele será redirecionado à outro controller, chamado painel.
Problema
A cada redirecionamento do controller site ao controller painel, seria realizado outra inicialização do sistema completo.
Solução
Uma solução elegante e correta para isso, é utilizar um Hook para informar ao Router, o controller correto a ser chamado.
O Router é quem define através da URL, qual controller deverá ser chamado, portanto a única coisa que terá de ser feita, é dizer à ele qual controller ele deverá chamar.
Criamos então, o arquivo hooks/site.php, o nome não importa, a não ser por fácil identificação posteriormente.
No arquivo, é especificado que no momento do evento system.routing, uma função (leia-se callback) será chamada, antes do Router::setup.
Esse callback definirá o controller correto à ser carregado.
<?php defined('SYSPATH') OR die('No direct access allowed.');
function hook_define_controller_padrao()
{
if (!empty(Router::$current_uri)) return;
if (Session::instance()->get('user'))
// usuário logado
Router::$current_uri = 'painel';
}
Você pode também impossibilitar o acesso à página de autenticação, quando o usuário já estiver autenticado, modificação a função callback acima, da seguinte forma:
function hook_define_controller_padrao()
{
$logado = Session::instance()->get('user');
if (empty(Router::$current_uri) && $logado)
// usuário autenticado
Router::$current_uri = 'painel';
elseif (Router::$current_uri == 'site/login' && $logado)
// exibir "página não encontrada"
Event::run('system.404');
}
Criada a função, é necessário que seja adicionada à lista de eventos a serem realizados, isso pode ser feito logo abaixo da função, ou no final do arquivo Hook.
Event::add_before(
'system.routing',
array('Router', 'setup'),
'hook_define_controller_padrao'
);
Existe também como definir novos eventos, mas isso fica para outro artigo, pois este é somente uma introdução sobre o assunto.
Utilize os Hooks sempre que possível, eles poderão reduzir inúmeras linhas no seu código, tornando-o mais enxuto, legível e organizado.