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:
Você utiliza o método estático 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
->from('tabela')
->where(array('categoria' => 1))
->limit(10)
->get();
Contando total de registros em uma tabela
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.
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:
--> 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:
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
Exemplo de utilização da biblioteca Pagination
(
'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
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];
}
}
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:
Também é permitido a utilização de Arrays:
Caio,
Parabéns pelo post! Uma correção: o construtor da Session verifica se existe uma instância criada do objeto Session, ou seja, tanto faz vc usar new Session ou Session::instance().
http://source.kohanaphp.com/trunk/system/libraries/Session.php
Bom te ver por aqui Marcelo. :D
Na verdade não, o que o construtor faz na verdade, é verificar se a instância existe, caso não exista, ele especifica que a instância foi criada, mas não evita que o novo objeto seja criado, que só não é criado quando o construtor dispara uma exceção.
Até mesmo por isso que muita gente coloca o construtor como método privado, evitando que seja chamado externamente.
{
private static $instance;
private __construct()
{
}
public static instance()
{
if (empty(self::$instance))
self::$instance = new Foo;
return self::$instance;
}
}
Muito bom artigo, tomei a liberdade de linkar em meu site :)
Abraço!
Caio,
Experimente criar $this->session = new Session em um controller X e novamente chamar $this->session = new Session em um controller Y. Voce vera que o objeto é o mesmo. Ou nao?
Na verdade, essa falsa impressão ocorre devido a biblioteca Session, assim como as outras bibliotecas do Kohana, utilizarem certos atributos como estáticos. Ou seja, são objetos diferentes porém contendo alguns atributos estáticos, acessíveis por qualquer um destes objetos.
$session_a->foo = 'bar';
var_dump(empty($session_a->foo));
$session_b = new Session;
var_dump(empty($session_b->foo));
// bool(false) bool(true)
Como pode-se ver, são objetos diferentes, o que, de qualquer forma, acaba “fugindo” do padrão Singleton.
Isso ai, correto! É um singleton meia-boca! :D
Mas qual a vantagem de usar este “singleton meia-boca” em vez de um com o construtor privado?
Fábio,
Na verdade não se trata de um “singleton” meia-boca.
Algumas bibliotecas do Kohana tem configurações próprias, que são armazenadas em suas instâncias, portanto, não pode simplesmente ignorar novas instâncias.
Um exemplo pode ser a biblioteca Pagination:
$y = Pagination::factory(array('style' => 'digg'));
O caso da Session, é um caso muito específico, pois todos sabemos que não há utilidade em instanciar duas classes de sessão, sendo que elas conterão sempre os mesmos dados.
É algo ainda em discussão, se a biblioteca Session deverá ser instanciada somente uma vez, ou se seguirá o padrão das outras bibliotecas, podendo ser instanciada várias vezes (somente para seguir um padrão).
Nas novas versões do Kohana, o método __construct será protegido (não privado), forçando todos a utilizarem o padrão Factory:
Talvez, na biblioteca Session em específico, o método factory() faça uma chamada por instance(), ao invés de new Session. É uma questão ainda a ser decidida.
[...] sempre procurando aproveitar o melhor do melhor.Caio Ariade escreveu um ótimo artigo falando do Kohana PHP: Boas práticas de desenvolvimento var addthis_pub = ‘marcelorodrigo’; var addthis_language = ‘pt’;var addthis_options = ‘email, [...]