Uma das coisas que eu mais gostei ao programar com Ruby On Rails foi o seu sistema de plugins. Como estou trabalhando com o CakePHP, que é copiado inspirado no Rails, resolvi dar uma olhada nos plugins que ele tinha online e acabei encontrando muita coisa boa. De tudo que vi, dois me chamaram a atenção:

URL Aliasing

Há uns dias eu postei como capturar missing_actions (quando o usuário acessa uma URL com action que não existe) e redirecionar para um controller que lidaria com o problema. Muito legal, mas não resolve o problema quando a URL aponta também para um controller que não existe.

O plugin URL Aliasing resolve exatamente esse problema, fornecendo um meio bem simples de lidar com erros de missing_controller.

Link: URL Aliasing

Symbi0nt’s Model Validation

Este não é exatamente um plugin, e sim um app_model.php pré-construído com métodos que facilitam bastante a parte de validação de dados do Model.

O principal é que ele define uma série de constantes com validações pré-definidas. Em vez de escrever suas validações, você usa constantes como VALID_IF_NOT_EMPTY, e VALID_IF_EMAIL. A mensagem de erro é especificada por você, então pode ser usado perfeitamente em projetos que não sejam em inglês.

Link: Symbi0nt’s Model Validation

Link: Exemplos de uso

Acho que já falei aqui sobre a minha paixão pelo Ruby on Rails, um framework de Ruby que me fez enxergar o desenvolvimento web de uma forma bem diferente. Percebi que as coisas poderiam ser feitas de uma forma muito mais rápida. Há cerca de 3 semanas comecei a trabalhar com o framework CakePHP, que é uma cópia do Ruby on Rails para a linguagem PHP, e nesse pouco tempo já aprendi algumas coisas que posso compartilhar.

Essa semana um trouxa moço muito simpático aqui do trabalho queria uma forma de redirecionar pra uma certa página caso o usuário digitasse um endereço inexistente dentro do site criado com o cake. A primeira coisa que se pensa é procurar um jeito de fazer isso através das rotas, mas eu procurei e não encontrei nenhuma forma de criar uma rota específica para controllers ou actions não existentes.

Como fazer, então? A solução é usar um misto dos recursos do Cake, com o básico do próprio PHP. Que venha a nós o beforeFilter e a herança de classes.

Como Redirecionar Endereços Inválidos

O CakePHP permite que você defina um método beforeFilter nos seus controllers, que será chamado antes da action (método do controller) ser chamada pelo framework. E como queremos que TODOS os nossos controllers saibam responder a um endereço inexistente, a melhor opção é criar o método beforeFilter no app_controller.php

Se seu projeto no cake ainda não tem o app_controller, é só você criar um arquivo chamado app_controller.php dentro da pasta app (e não na pasta controllers), e dentro dele colocar o código:

<?php
class AppController extends Controller {
 
}
?>

E dentro da classe vamos adicionar nosso beforeFilter:

<?php
class AppController extends Controller {
    function beforeFilter() {
        if( !empty($this-&gt;params['action']) &amp;&amp; !method_exists($this, $this-&gt;params['action']) ) {
            $this-&gt;redirect(array('controller' =&gt; 'main', 'action' =&gt; 'missing'));
        }
    }
}?>

O que fizemos acima? A função method_exists é um recurso do PHP que testa se um método existe em um dado objeto. Passamos $this como o objeto, e $this->params['action'] como o método a testar. Se retornar false significa que a action não existe, e o usuário está tentando acessar uma action inexistente. Então o beforeFilter redireciona o usuário pra um lugar que realmente existe, antes mesmo que o framework tente chamar a action. Do exemplo acima, você pode trocar o controller ‘main’ e a action ‘missing’ pelo que for melhor para o seu projeto. Basta ter certeza de que está redirecionando pra um controller e uma action que realmente existam.

Note que isso só funciona se o usuário tentar acessar um endereço que aponte para uma action inválida, mas em um controller válido. Se o usuário acessar apenas site.com/pudim, o CakePHP vai buscar um controller pudim e aí vai dar erro mesmo. Uma solução possível seria criar uma rota definindo que caso acessem um endereço com apenas um parâmetro depois do domínio, ele redirecione pra um controller específico e passe aquele parâmetro único como rota. Pra quem não sabe configurar as rotas, amanhã eu explico.


© 2007 Leonardo Bighi | iKon Wordpress Theme by TextNData | Powered by Wordpress | rakCha web directory