Roteamento personalizado de URLs em CodeIgniter

As funções de roteamento definidas em CodeIgniter podem ser personalizadas de maneira que se criem novas regras específicas nas aplicações.

Por Miguel Angel Alvarez - Tradução de Celeste Veiga


Publicado em: 19/11/12
Valorize este artigo:
CodeIgniter tem um sistema bastante prático pelo qual as URL das aplicações web são roteados a controladores e métodos dentro deles. É um sistema através do qual conseguimos que URLs amigáveis para buscadores se executem em pedaços de código aos que ademais enviamos todo o tipo de parâmetros.

Ao longo do Manual de CodeIgniter, já estivemos utilizando estas funções de roteamento de maneira intensiva e estavam explicadas no artigo URLs em CodeIgniter. No presente texto vamos explicar como podemos sobreescrever esse roteamento predeterminado, criando URLs muito mais personalizadas, às que atribuímos diferentes recursos para sua execução.

De maneira predeterminada, o roteamento de CodeIgniter faz com que o primeiro elemento depois do nome do domínio seja a classe ou controlador que tem que gerenciá-lo. O segundo elemento da URL seria o método dentro desse controlador e o terceiro, e seguintes, seriam os parâmetros enviados ao método que executaria essa rota. Isso pode ser visto no seguinte esquema de URL:

http://meudominio.com/controlador/metodo/parametro

Porém, este modelo de trabalho, que pode ser ótimo para a maioria dos casos, pode não sê-lo tanto para muitos outros. Felizmente, os desenvolvedores de aplicações de CodeIgniter dispõem de uns mecanismos para sobreescrever essas rotas predeterminadas e fazer com que se adaptem a suas necessidades, para criar rotas diferentes, como podem ser:

http://midominio.com/productos/21/
http://midominio.com/productos/13/
http://midominio.com/productos/9/

De maneira predeterminada o segundo segmento da URL corresponderia com o nome do método que executaria a página, mas nesses exemplos, como se pode ver, estaríamos passando o identificador de um produto, que provavelmente gostaríamos que se enviara como parâmetro a um método de controlador.

Criando suas próprias regras de roteamento

Existe um arquivo onde podemos gerar todo os tipos de regras para conseguir um roteamento de URIs distinto do predeterminado. Esse arquivo, podemos encontrá-lo no diretório dos arquivos de configuração:

system/application/config/routes.php

Ali poderemos definir um array chamado $route onde colocaremos todas as regras de roteamento que queremos criar de maneira específica em nossa aplicação web CodeIgniter.

Se abrimos o mencionado arquivo poderemos ver que já há dois valores de roteamento definidos no array $route.

$route['default_controller'] = "welcome";
$route['scaffolding_trigger'] = "";

Esses dois valores de roteamento são próprios de CodeIgniter e estão reservados para qualquer outro uso. Nós podemos mudar os valores predeterminados de roteamento para essas variáveis, mas não podemos criar rotas de nossa aplicação utilizando-os. Ademais estas duas rotas predeterminadas devem aparecer antes de qualquer outra rota que definamos posteriormente no arquivo routes.php.

Nota: O primeiro deles, default_controller, serve para definir o controlador por padrão que seria executado no caso de que não se indique nenhuma rota na URL (na raiz do domínio). Na configuração que vem na instalação básica de CodeIgniter, se não se específica nada na URL, se abre o controlador "welcome", porém podemos mudar esse controlador predeterminado segundo nossas necessidades.
Ao falar de controladores já se comentou o que era o controlador por padrão e como podemos mudá-lo. Agora já sabemos que essa mudança de controlador predeterminado na realidade não era mais que a definição de uma regra de roteamento em CodeIgniter.

Então, para criar nossas próprias regras, se trataria simplesmente de atribuir novos valores ao array associativo $route e para isso temos que atender à seguinte sintaxe:

$route['de_onde_vens'] = 'para_onde_vais';

Como se pode ver, nas rotas temos duas partes:

  • No índice do array associativo, 'de_onde_vens', colocamos um padrão que deve coincidir para que se produza um roteamento.
  • No valor atribuído a esse índice do array, 'para_onde_vais', colocamos a rota à que estamos enviando o fluxo de execução de CodeIgniter.
Agora vejamos um exemplo de rotamento real:

$route['desarrolloweb'] = "empresa/tecnologia/5";

Isto quer dizer que, se CodeIgniter encontra "desarrolloweb" no primeiro segmento da URL (depois do nome do domínio), se redirecionará o fluxo da aplicação para o controlador "empresa", o método "tecnologia" e passando-lhe como parâmetro o dígito 5.

Claro que estas rotas poderão ser definidas por meio de padrões, de várias maneiras, para torná-las mais potentes. Para isso, esses padrões de roteamento, que servem para definir as rotas 'de_onde_vens', podem incluir caracteres curinga ou expressões regulares.

Nota: De maneira geral, ao definir as regras de roteamento não se devem colocar as barras no começo nem no final da rota. Por exemplo, não use "/empresas/tecnologia/1/", mas sim "empresas/tecnologia/1".

Definir rotas com caracteres curingas

Os caracteres curinga nos servem para definir padrões simples de roteamento. Existem dois tipos de caracteres curinga que podemos utilizar:

(:num)
Este curinga serve para qualquer cadeia que contenha somente dígitos numéricos.

(:any)
Este curinga serve para qualquer cadeia, com qualquer caractere.

Para ver como utilizar estes caracteres curinga na geração de regras de roteamento, podemos observar o seguinte exemplo:

$route['produto/(:any)'] = "produtos/busca";

Neste exemplo, uma URL que tenha a palavra produto no primeiro segmento e no segundo segmento qualquer conjunto de caracteres, se roteará pelo controlador produtos e o método busca.

$route['cliente/(:num)'] = "empresa/mostra_cliente/$1";

Neste segundo exemplo, se o sistema de roteamento de CodeIgniter detecta que no primeiro segmento da URL está a palavra "cliente" e no segundo segmento há um número, a aplicação rotearia esta chamada através do controlador "empresa" e o método "cliente". Ademais, passaria esse número, do segundo segmento da URL de origem, como parâmetro ao método mostra_cliente.

Criar as regras de roteamento com expressões regulares

Toda a potencia das expressões regulares podemos aplicá-las a CodeIgniter para criar regras de roteamento tão complexas quanto desejemos.

$route['manuais/([0-9]+)'] = "manuais/mostra/$1";

Se detectamos na primeira parte a palavra manuais e no segundo segmento um conjunto de dígitos numéricos, se rotearia através do controlador manuais, o método mostra, com o parâmetro indicado como dígitos numéricos.

$route['espanha/([a-z_-]+)/([a-z_-]+)'] = "localidade/$1/$2";

Esta regra de roteamento, um pouco mais complexa, serviria para detectar a palavra "espanha" no primeiro segmento e depois dois segmentos adicionais, com respectivas expressões regulares que aceitariam letras de "a" a "z" com hífen baixo ou médio, repetidas uma ou mais vezes. As rotearia através do controlador "localidade" e em seguida, o método especificado na primeira expressão e o parâmetro indicado na segunda expressão regular.

Nota: no caso de usar "backreferences" das expressões regulares, deve-se usar a sintaxe com o dólar no lugar da contrabarra.






Usuários :    login / registro

Manuais relacionados
Categorias relacionadas
O autor

Home | Sobre nós | Copyright | Anuncie | Entrar em contato