Configuração de rotas (routes) no CodeIgniter

13 de julho de 2010, em Configurações, Passos Iniciais, por Tárcio Zemel

Rotas (routes) no CodeIgniter: configuração

O relacionamento padrão entre uma URL e um Controller no CodeIgniter segue a estrutura exemplo.com/classe/metodo/id/ (como mostrado no artigo sobre Controllers no CodeIgniter), mas, às vezes, é preciso “remapear” este relacionamento. No CodeIgniter, isso é feito através de routes (rotas).

Este é um guest post de Julio Bitencourt, que pode ser encontrado na internet através de:

Tomemos como exemplo a visualização de produtos em uma loja virtual. Digamos que a página para visualização dos detalhes de uma cadeira de balanço seja acessada através da URL minhaloja.com/produtos/detalhes/1/2 onde “produtos” é nosso controller; “detalhes” é a função que exibe os detalhes do produto; “1″ seja o código da categoria cadeiras; e “2″ seja o código de nossa cadeira de balanço. Esta estrutura funciona perfeitamente, mas, convenhamos, não é “elegante”.

Configuração de rotas

A configuração de rotas é feita através do arquivo /application/config/routes.php, na instalação padrão do CodeIgniter. Alguns exemplos de configuração de routes:

1
2
3
4
5
6
// "minhaloja.com/fale-conosco" vai direcionar para o controller "contato"
$route['fale-conosco'] = "contato";
 
// "minhaloja.com/fale-conosco" vai direcionar para o controller "cadastros"
// utilizando a função "novo_cliente"
$route['cadastro/clientes'] = "cadastros/novo_cliente";
Rotas são executados na ordem em que são definidas. Rotas “superiores” sempre prevalecem sobre rotas “inferiores”.

Wildcards ou Curingas

Você pode usar curingas (wildcards) para configurar rotas. Desta forma, é possível deixar as URLs mais dinâmicas. Existem 2 tipos de wildcards:

  1. :num. O wildcard “:num”, utilizado para rotear somente números.
  2. :any. O curinga “:any”, utilizado para rotear qualquer caractere.

Voltando ao exemplo anterior, que tal transformar a URL “minhaloja.com/produtos/detalhes/1/2″ em “minhaloja.com/1/2/”? Seguindo a estrutura padrão do CodeIgniter, pressupõe-se que se está chamando o controller “1″ e, dentro do controller, a função “2″, o que não existe na prática.

Para resolver o problema, vamos escrever a seguinte rota:

1
$route[':num/:num'] = "produtos/detalhes";

Dessa forma, haverá direcionamento para “produtos/detalhes” sempre que os seguimentos 1 e 2 da URL sejam numéricos.

Exemplo da função detalhes dentro do controller “produtos”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Produtos extends Controller
{
    function Produtos()
    {
        parent::Controller();	
    }
 
    function index()
    {
        // Função index é acessada quando não for passada nenhuma função para o controller
    }
 
    function detalhes()
    {
        echo $this->uri->segment(1); // retorna o código da categoria
        echo $this->uri->segment(2); // retorna o código do produto
    }
}

Rotas com expressões regulares

É possível utilizar expressões regulares para definir as rotas no CodeIgniter. Vamos reescrever a rota do nosso exemplo:

1
$route['(:num)/(:num)'] = "produtos/detalhes/$1/$2";

Agora, o controller fica assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Produtos extends Controller
{
    function Produtos()
    {
        parent::Controller();	
    }
 
    function index()
    {
        // Função index é acessada quando não for passada nenhuma função para o controller
    }
 
    function detalhes($id_categoria, $id_produto)
    {
        echo $id_categoria; // retorna o código da categoria
        echo $id_produto; // retorna o código do produto
    }
}

Rotas e SEO

A URL minhaloja.com/1/2/ ficou bem mais curta e elegante, mas não é amigável quando vamos falar de SEO. É muito melhor ter uma estrutura como:

http://minhaloja.com/cadeiras/cadeira-de-balanco/

Esta URL é “amigável” para os motores de busca e, se você tiver, por exemplo, um campo no cadastro de produtos da loja para armazenar o nome da categoria e uma “descrição de URL” (slug) do produto – como “cadeira-de-balanco” -, fica muito fácil. Essa técnica é comumente chamada de URLs amigáveis.

A regra do exemplo é:

1
$route['(:any)/(:any)'] = "produtos/detalhes/$1/$2";

O controller permanece inalterado; só é preciso buscar no banco de dados os produtos com base nos slugs de categoria e produto – caso não saiba como criar slugs, confira o artigo “URLs amigáveis (slug) à WordPress“, do blog desenvolvimento para web.

Rotas reservadas

Existem dois wildcards reservados no CodeIgniter: “welcome” e “scaffolding”. Ou seja, você não poderá utilizar as seguintes rotas em seus projetos:

1
$route['default_controller'] = 'welcome';

E

1
$route['scaffolding_trigger'] = 'scaffolding';

Conclusão

Rotas servem para alterar o relacionamento padrão entre uma URL e um Controller no CodeIgniter. Sabendo utilizar bem os tipos de rotas disponíveis, é possível criar estruturas incríveis, que realmente facilitam o desenvolvimento e acesso a controllers e funções – e o SEO agradece!

Com estas dicas já é possível configurar suas rotas e melhorar a navegação em seus projetos com CodeIgniter.

Espero que tenham gostado deste meu primeiro artigo no CodeIgniter Brasil e fiquem ligados para mais novidades!

6 comentários em "Configuração de rotas (routes) no CodeIgniter"

gravatar

Daniel Polito  em 13 de julho de 2010

Parabens pelo post… Eu precisei de algo assim há algum tempo e fiz uma gambiarra na classe Routes do CodeIgniter mesmo, funcionou, mas é bom saber o jeito certo de se fazer…

Abraços

[Responder]

gravatar

Robson Martins  em 13 de julho de 2010

otimo post e parabens pelo blog …

[Responder]

gravatar

Ricardo dos Santos  em 17 de julho de 2010

Mais uma vez… parabens…

Como de costume… passando aqui para ter ajuda com minhas dificuldades, já que sou novato no CI…

Mais uma vez, um post seu me ajudando…

Valeu..

[Responder]

gravatar

Julio Bitencourt  em 20 de julho de 2010

Daniel! Que bom que ajudou! Dê uma pesquisada em mais opções de rotear com expressões regulares. Quebram um galho!

Robson. Obrigado :)

Ricardo. Muito obrigado! Continue acompanhando o CodeIgniter Brasil, sempre teremos coisa nova por aqui!

[Responder]

gravatar

Vinicius  em 23 de julho de 2010

Muito legal. Mas, no caso do exemplo, se existir uma página algo como minhaloja.com/conteudo/quem_somos o route tentará localizar um detalhe de produtos, correto?! =/

[Responder]

Julio Bitencourt Reply:

Exato Vinícius.

O problema de se utilizar (:any) no primeiro seguimento da URI é que todos seus controllers deixarão de funcionar.

Para contornar este problema, utilize Expressões Regulares para restringir a rota. Exemplo:

$route['^((?!conteudo|sobre|outro-controller...)\S*)'] = “produtos/detalhes/$1/$2″;

Esta também foi uma dúvida do Daniel Polito

[Responder]

Comente!