Sluggable Behavior

Neste artigo, mostrarei uma grande ferramenta, o Sluggable Behavior, que agiliza o trabalho quando dependemos de url’s que são geradas dinamicamente.

Inicialmente, explicarei o que é behavior.

Behavior é um comportamento que você pode adicionar a um modelo. Um exemplo bem simples é quando precisamos formatar a data de um registro qualquer para o formato brasileiro. Geralmente, os bancos de dados adotam o formato americano de data ‘aaaa-mm-dd hh:mm:ss’. Para formatar a data conforme nosso padrão ‘dd/mm/aaaa hh:mm:ss’, podemos construir um behavior que converta a data antes de disponibilizar para visualização e, ao mesmo tempo, fazer a conversão no sentido inverso, transformando a data do formato brasileiro para o americano antes de registrar no banco de dados.

Para o nosso artigo, o Sluggable comporta-se como um conversor de strings, removendo os espaços em branco e caracteres especiais, permitindo somente chars de a-z, A-Z e de 0-9. Este behavior, em especial, possui algumas características interessantes. Além de trocar o espaço em branco por outro caracter, como o -, _ ou +, ele possibilita trabalhar com codificação utf-8. Seu código fonte encontra-se na página do bakery CakePHP: http://bakery.cakephp.org/articles/view/sluggable-behavior.

Abaixo, um exemplo de utilização e configuração:

Imagine um modelo Artigo, onde o mesmo deve ser acessado via url /titulo-do-artigo.

Então:

<?php
class Artigo extends AppModel {
public $actsAs = array('Sluggable' => array(
'label' => 'titulo',
'slug' => 'titulo_normalizado',
'separator' => '-',
'length' => 100,
'overwrite' => false,
'translation' => 'utf-8'
));
}

Abaixo, detalhes dos parâmetros de configuração na ordem:
Parâmetro label
Representa qual coluna ou campo do banco de dados será normalizado. Em nosso caso, conforme a regra de negócio, o título do artigo será o utilizado.
Parâmetro slug
Representa a coluna ou campo do banco de dados que guardará o label normalizado, cujo nomeei de titutlo_normalizado. Também pode-se nomear de slug, ou como preferir.
Parâmetro separator
Especifica qual caracter será utilizado para troca dos espaços em branco. Na internet, os caracteres mais utilizados são traço simples -, underscore _ ou mais +. No exemplo, utilizei o -.
Parâmetro length
Especifica o tamanho máximo da string gerada para o slug. Caso a string gerada seja maior que o lenght, o mesmo será truncado.
Parâmetro overwrite
Este parâmetro é a característica mais interessante deste behaviour. Caso um registro seja alterado, ele atualizará também o campo do slug. Imagine um artigo que já foi indexado pelos buscadores, como o Google, Bing, entre outros. O endereço já se espalhou pela internet, porém uma atualização em seu título acarretará também uma atualização no slug. Caso você não trate endereços antigos em seu sistema, não é muito recomendado que o slug seja alterado, pois seus leitores ficariam um tanto chateados em acessar uma página que não existe mais. Sendo assim, é possível especificar para o sluggable.overwrite = false, fazendo com que o slug nunca seja alterado.
Parâmetro translate
Auxilia quando lidamos com codificação diferentes. Os valores permitidos são utf-8 ou iso-8859-1. Ao ilustrar seu funcionamento temos:

Para os títulos:
- Resistência dos Materiais para aprender e gostar.
- A resposta para a vida, o universo e tudo mais.
Teríamos os seguintes resultados:
- resistencia-dos-materiais-para-aprender-e-gostara
- resposta-para-a-vida-o-universo-e-tudo-mais
Com isso, temos o behavior configurado e pronto para se utilizado.

Até a próxima!