URLs avançadas com o routeClass do CakePHP Artigo

Conheça os cursos gratuitos do WebDevBr! - Inscreva-se!


Este artigo foi publicado a 5 anos atrás.

Essa dica esperta é pra quem quer desenvolver um site em CakePHP e precisa disponibilizar a URL no seguinte formato: www.seusite.com.br/pagina, ou seja, sem controller ou action, apenas o "slug" da página.

Entendendo a profundidade da dificuldade

(Esta parte do artigo é apenas didática, se não quer entender, apenas pule para Instalando o meu routeClass!) Entenda que por padrão o cakePHP usa o esquema /:controller/:action/:parametro1/:parametro:2/:parametro3, com isso em mente note que precisamos passar somente o primeiro parametro e o controller e a action deverá ser setado no segundo paremetro do Router::connect, ótimo então se eu fizer assim vai funcionar:

Router::connect('/*', array('controller' => 'pages', 'action' => 'display'));

Isso é bem básico, se você levar em conta que no CakePHP já vem algo bem parecido "de fábrica", o famoso:

Gostou deste artigo?

Receba atualizações semanais com novos artigos do WebDevBr e outras dicas!

Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));

Vai funcionar bem, porém com um inconveniente, se você não tem outros controllers isso vai cair como uma luva pra você, se não você vai ter que setar controller por controller no seu routes.php simplesmente porque eles vão parar de funcionar, ótimo se você não tem muitos controllers. Basta seta-los antes dessa linha e o CakePHP dará prioridade e substituirá a informação que está atrapalhando (o CakePHP da prioridade para os primeiros routes que são passados em caso de algum conflito).

Router::connect('/Users/:action', array('controller' => 'Users'));
Router::connect('/Users/:action/*', array('controller' => 'Users'));
Router::connect('/*', array('controller' => 'pages', 'action' => 'display'));

Pronto, você pode repetir isso (as duas primeiras linhas) para quantos controllers precisar, bastando substituir aonde está User. Outra forma é:

Router::connect('/:slug', array('controller' => 'pages', 'action' => 'display'), array('pass' => array('slug')));

Isso também resolve, mas vai gerar outro inconveniente, toda url /qualquercoisa vai enviar para o controller e action expecificado, incluindo os /controller que deveria ir para o controller indicado e cair na action index. Novamente teremos que partir do princípio que o CakePHP interpreta as rotas exatamente na ordem em que você está no arquivo, então pra resolver:

Router::connect('/users', array('controller' => 'Users', 'action' => 'index'));

E isso pra cada controller. Mas para ai, e se você tiver dezenas de controllers, vai ter que ficar setando um por um, ou se for adicionar algo novo vai ter que voltar aqui só pra fazer isso! Calma lá que tenho a solução para seus problemas: O routeClass!!! O routeClass é um parâmetro do routes que permite a você enviar a URL para uma "classe de rota" que fará todo o tratamento e  irá decidir o que fazer com sua URL, pode parecer complicado mas não é (de instalar o que eu já fiz).

Instalando o meu routeClass

Baixe o SeoRoute

01 - Descompacte e copie o arquivo SeoRoute.php para a pasta app/Lib

02 - Abra seu routes.php em app/Config/routes.php e cole a linha abaixo no seu routes.php;

App::uses('SeoRouter', 'Routing/Route');
Router::connect('/:slug', array('controller' => 'pages', 'action' => 'display'), array('pass'=>array('slug'),'routeClass' => 'SeoRouter'));

Não esqueça de trocaro seu controller e sua action alí no 'controller' => 'pages', 'action' => 'display'. Pronto... está instalado.

Mas o que isso faz?

É bem simples, ele verifica se existe um controller com o slug enviado, e se existir ele apenas passa este roteamento e deixa o CakePHP se virar pra encontrar o controller e a action, agora se não existir, ele passa o slug para o controller e action informados como um parametro, ou seja, você pode acessar normalmente via public function display($slug), aonde display é minha action e $slug o enviado na url, lembre-se que $slug pode ser qualquer coisa, não somente $slug. Este routeClass é uma versão simples do que ensino a desenvolver no curso de CakePHP Avançado lá no meu site de cursos, o WebDevBr. Atualizei este artigo para uma versão diferente do SeoRoute, mais simples, rápida e eficiente de se usar, por exemplo, depois de carregar (com App::uses('SeoRouter', 'Routing/Route');) você pode usar quantas vezes quiser, para vários controllers e/ou actions diferentes, ao contrário do anterior. Uma dica esperta: O App::import('Model', 'SeuModel'); permite usar um model no RouteClass, imaginou uma versão de roteamento que consulta o banco de dados? Espero que seja útil.


Cursos relacionados


* Parcelamento apenas cartão de crédito! Pode haver uma pequena variação no parcelamento em relação a simulações apresentadas!