Este artigo tem como objetivo relembrar algumas das funcionalidades disponibilizadas pelo excelente framework Kohana PHP. Funcionalidades estas que podem facilitar, e muito, na hora de desenvolver ou refatorar uma aplicação.

Serve também para aqueles que estão começando a se familiarizar com o framework e querem aprender um pouco mais sobre as possibilidades que ele oferece.

Singleton

Singleton é um padrão (Design Pattern) que garante que suas classes serão instânciadas somente uma vez, podendo ser acessadas de forma global, evitando a criação de várias instâncias desnecessarias da mesma.

No KohanaPHP isso pode ser aplicado nas bibliotecas, pois todas as bibliotecas tem suporte a Singleton.

Ao invés de criar uma nova instância:

$this->session = new Session;

Você utiliza o método estático instance:

$this->session = Session::instance();

O que o método instance cria uma nova instância, armazena-a em uma variável, e a retorna. Na próxima chamada é feita uma verificação, caso uma variável com a instância já exista, ao invés de criar uma nova, ele retorna a instância contida na variável.

Utilize o Query Builder

Muita gente odeia Query Builders por serem um tanto limitados, porém se você quiser que a sua aplicação seja independente de banco de dados, use-o. Deixe para escrever SQL’s somente quando for realmente necessários.

O Query Builder suporta method chaining, o que pode deixar o código mais elegante.

Exemplos de Method Chaining com Query Builder

$result = $this->db->select('id, nome')
                   ->from('tabela')
                   ->where(array('categoria' => 1))
                   ->limit(10)
                   ->get();
$result = $this->db->select('id')
                   ->getwhere('tabela', array('categoria' => 2));

Contando total de registros em uma tabela

$total_usuarios = $this->db->count_records('usuarios');

Utilize segmentos, de preferência nomeados

Ao invés de usar variáveis $_GET, dê preferência aos segmentos. Além de mais elegantes, são mais fáceis de serem manipulados.

http://meusite/clientes/busca/cidade/Bauru/estado/SP

Onde clientes é o controller, busca é o método, e cidade e estado são segmentos.

$cidade = uri::segment('cidade');
$estado = uri::segment('estado');

Nunca modifique os arquivos do diretório system

Os recursos disponíveis pelo Kohana, são carregados no formato de cascata, ou seja, primeiro ele verifica se o arquivo existe no diretório application, caso não exista, então procura nos diretórios de cada módulo, em seguida no diretório system.

Um bom exemplo são os arquivos de configuração, localizados no diretório system/config/.

O caminho percorrido até ele chegar em qualquer arquivo dentro deste diretório, é o seguinte:

application/config/auth.php
--> modules/archive/config/auth.php
--> modules/flot/config/auth.php
--> modules/auth/config/auth.php (encontrado)

Caso não fosse encontrado, ele continuaria a pesquisar, terminando no diretório system:

system/config/auth.php

Por isso é muito importante transferir todos os arquivos necessários para o diretório application, e nunca modifica-los nos seus diretórios de origem.

Use os helpers e bibliotecas disponíveis

O Kohana disponibiliza uma série de helpers e bibliotecas que podem facilitar e muito o desenvolvimento. Não invente a roda à todo momento.

Exemplo de utilização do helper Upload

$filename = $_FILES['arquivo']['name'];
$tmp_name = $_FILES['arquivo']['tmp_name'];

$filename_path = upload::save(array
(
    'name' => $filename,
    'tmp_name' => $tmp_name
), $filename);

$filename = basename($filename_path);

Exemplo de utilização da biblioteca Pagination

$this->pagination = new Pagination(array
(
    'base_url'       => 'noticias/page/',
    'uri_segment'    => 'page',
    'total_items'    => $total_num_rows,
    'items_per_page' => $rows,
    'style'          => 'digg'
));

echo $this->pagination;

No exemplo acima, será impressa uma paginação no estilo Digg.

Existem outros estilos de paginação que podem ser conferidos através da documentação:

http://docs.kohanaphp.com/libraries/pagination

Estenda os helpers, sempre que necessário

Uma prática muito encorajada no Kohana é a extensão dos helpers para se adequar as suas necessidades.

Por exemplo, podemos estender o helper format, para formatar também o tamanho de arquivos, criando o arquivo MY_format.php dentro do diretório helpers da sua apliação, geralmente application/helpers.

applications/helpers/MY_format.php

<?php defined('SYSPATH') or die('No direct script access.');

class format extends format_Core
{
    public static function filesize($size)
    {
        $sizes = array('B', 'kB', 'MB', 'GB',
                    'TB', 'PB', 'EB', 'ZB', 'YB');
        $c = count($sizes) - 1;
        for ($i = 0; $size > 1024 && $i < $c; $i++)
            $size /= 1024;
        return round($size, 2) . $sizes[$i];
    }
}
echo format::filesize(1024*4); // 4kB

Lembre-se, todo arquivo de extensão deve ser iniciado por MY_, é um padrão definido pelo Kohana.

Internacionalização

Criar uma aplicação multi-idiomas com o Kohana é relativamente simples.

Primeiro crie o diretório i18n dentro de applications, e em seguida crie o diretório pt_BR.

applications/i18n/pt_BR/

Após isso, as strings são divididas entre arquivos, dentro desse diretório, por exemplo:

applications/i18n/pt_BR/caption.php

Dentro de cada arquivo, são especificadas as strings:

<?php defined('SYSPATH') OR die('No direct access allowed.');

$lang = array
(
    'submit' => 'Enviar',
    'cancel' => 'Cancelar',
    'confirm' => 'Confirmar',
);
echo Kohana::lang('caption.submit'); // Enviar

Também é permitido a utilização de Arrays:

'confirm' => array
(
    'edit?' => 'Editar texto?',
    'remove?' => 'Remover texto?'
);
echo Kohana::lang('message.confirm.edit?'); // Editar texto?