Sluggable Behaviour

Nossa, faz tempo que não escrevo nada por aqui né? Bom, hoje eu fiz um pouquinho de código que fiquei com vontade de compartilhar.
No mundo da web, um(a) slug é a representação de um título ou conteúdo que pode ser adicionado à URL de uma página. Nos últimos tempos, o(a) slug tem recebido maior atenção por ser um ótimo fator na hora de otimizar o seu site para buscadores (SEO), por ele(ela) está sempre presente nos principais CMS’s por aí como, por exemplo, o Wordpress.

Eu estava fazendo um sisteminha simples de e-commerce em CakePHP e precisava criar slugs para as categorias e produtos da loja. Eu já havia escrito um código que fazia isso pra mim, mas estava solto no app_model.php. Eu sabia que já existia um behaviour que fazia exatamente isto. Era o Sluggable Behaviour, escrito pelo Mariano Iglesias, um grande desenvolvedor que trabalha com Cake.
Apesar de ser um behaviour muito bem escrito e flexivel, eu fiquei com vontade de tentar fazer minha própria versão dele. Algumas coisas, com a própria geração do(a) slug poderiam ficar por conta da função Inflector::slug() por exemplo, dentre outras pequenas mudanças que eu gostaria de ver no código. Por isso eu fui lá e tentei fazer meu próprio behaviour. Na verdade, eu usei o código do Mariano como base e fui trabalhando em cima, o que me ajudou muito a entender como behaviours funcionam e devem ser escritos. Se você comparar os códigos, vai ver muitas coisas similares.
Eu não tenho a mínima pretenção de dizer que o que eu fiz é melhor que o original, porque tenho quase certeza que não é, mas é uma solução mais simples e mais leve, então alguma vantagem tem. Se quiser usar, crie um arquivo com o nome “sluggable.php” dentro da pasta /app/models/behaviours e coloque o seguinte conteúdo lá:

Exemplo: Digamos que você tem um model chamado “Post”, e nesta tabela você possui um campo chamado “title” e outro “slug”. Para usar o meu Sluggable Behaviour, basta adicionar a seguinte linha no seu /app/modesl/post.php

var $actsAs = array('Sluggable');

Pronto! Isto basta para que, toda vez que você salvar um novo post, um(a) slug seja criada a partir to campo title inserido. Se os campos no seu banco tem outros nomes, fica fácil configurar o behaviour para que ele responda a essas diferenças. Exemplo:

var $actsAs = array('Sluggable' => array(
'fields' => 'titulo',
'slugfield' => 'url'
));

Se você quiser concatenar as informações de mais de um campo para gerar a slug, basta indicar a chave ‘fields’ como uma array, assim:

var $actsAs = array('Sluggable' => array(
'fields' => array('titulo', 'codigo'),
'slugfield' => 'url'
));

Por padrão, se você escrever um título como “Este é meu título” o(a) slug vai ficar assim: este-e-meu-titulo. Se você quiser, pode modificar o separador das palavras:

var $actsAs = array('Sluggable' => array(
'fields' => array('titulo', 'codigo'),
'slugfield' => 'url',
'separator' => '_'
));

Dentre outras opções, você ainda pode configurar as seguintes chaves:

var $actsAs = array('Sluggable' => array(
'fields' => array('titulo', 'codigo'),
'slugfield' => 'url',
'separator' => '_',
'length' => 256, //define um tamanho padrão para o(a) slug - o padrão é "256"

'overwrite' => true, //se verdadeiro, modifica o(a) slug na hora da edição
//caso contrário, mesmo editando, o(a) slug permanecerá
//igual ao da adição - o padrão é "false"

'lower' => false //se verdadeiro, transforma todo(a) slug em caixa baixa - o padrão é "true"
));

É isso! Gostaria de deixar claro, mais uma vez, que este behaviour é totalmente inspirado pelo behaviour do Mariano. Mantive o mesmo nome não porque eu ache que o meu possa substituir o dele, mas simplesmente porque eu queria que este fosse o nome do behaviour no meu projeto, deixando o código mais bonito e coerente.
Tenho certeza que pode ter alguns erros e outras coisas podem ser melhoradas, por isso, sinta-se à vontade para sugerir, criticar ou elogiar! Se houver alguma dúvida também, é só comentar! Abraços!