CodeIgniter – URLs

No último post abordamos a introdução ao CodeIgniter (CI) framework, suas características e também como fazer para baixá-lo, instalá-lo e configurá-lo.

O tema de hoje são as URLs no CI. Veremos como funciona e como configurá-las à nossa maneira.

Por padrão, o CI utiliza URL amigáveis em sua estrutura para facilitar a utilização das idéias do MVC e para a aplicação ser melhor encontrada pelos mecanismos de busca.

Primeiramente, é necessário entender que as URLs no CI respeitam a seguinte estutura:

www.seusite.com/classe/método/

Podemos concluir então que o primeiro parâmetro sempre se referencia ao Controller (que é uma classe) e o segundo será o Método(função ou action) dessa classe. Para melhor entender, imagine a seguinte url:

www.seusite.com/produtos/listar/

Essa URL fará com que seja instanciada a classe/controller Produtos e o método listar() será executado. E por sua vez, dentro desse método estará definido em quais models será buscado as informações e quais views serão necessárias para renderizar a página. (OBS: Se o segundo parâmetro(método) não for especificado, por padrão é executado o método index() do controller).

O terceiro e demais parâmetros podem ser os possíveis argumentos que estejam implementados no método. Exemplo:

www.seusite.com/produtos/detalhes/1

Essa url instanciará a classe Produtos e executará o método detalhes que deve receber um parâmetro (o ID do produto por exemplo). Assim ele mostrará os detalhes do produto de código 1. Fique à vontade para utilizar quantos parâmetros forem necessários.

Removendo o index.php

Por padrão, o arquivo index.php é adicionado às URLs do CI:

www.seusite.com/index.php/classe/método

Não se preocupe. Isso pode ser simplesmente alterado caso você queira. Basta criar na raiz do seu projeto um arquivo .htaccess e definir uma regra de reescrita (Veja aqui um post sobre reescrita URLs com .htaccess).

1
2
3
4
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

Assim, exceto pastas e arquivos, toda url se submeterá à regra de reescrita que definimos. Logo a seguinte estrutura funcionará sem problemas:

www.seusite.com/classe/método

Bom, por hoje é só.

No próximo post implementaremos nossos primeiros controllers. Assim tudo que foi abordado hoje ficará mais claro 😉

Espero um feedback de vocês na caixa de comentários.

Abraço!

Confira todos os posts da série CodeIgniter Framework

É formado em Sistemas de Informação, pós-graduado em Sistemas de Banco de Dados e mestre em Educação com foco em Tecnologias Sociocomunitárias. Trabalha como professor de ensino técnico e tecnológico no Instituto Federal de Educação, Ciência e Tecnologia de São Paulo ministrando disciplinas nas áreas de programação, banco de dados, desenvolvimento de projetos e engenharia de software.

Posts relacionados

Comentários

  1. Tem como resolver o problema com as imagens…
    é um saco, pois desenvolvo com pelomenos 1 parâmetro amigável “./amigavel&outro=1”
    não existe outra forma que não seja link completo?

  2. Rafael, ótimo post!
    Mas tenho um dúvida, no caso se eu fosse fazer uma area administrativa, por exemplo:
    http://www.meusite.com.br/admin

    nesse caso o controller seria o admin, mas e se eu quisesse criar um controller pra cada pagina que eu fosse administrar, como ficaria? Porque dai se eu passase a pagina ela seria uma action, por exemplo:

    http://www.meusite.com.br/admin/produtos

    aqui eu estaria chamando a action produtos, mas eu queria que produtos fosse um controlador, e o proximo da sequencia que fosse a action, como se ele ignorasse o admin.

    tipo assim:

    http://www.meusite.com.br/admin/produtos/novo

    1. Olá Felipe,

      Ótima pergunta. Na verdade vou abordar isso no próximo post (que será Controllers e Rotas).

      Mas já te adianto que é possível separar os controllers em pastas. Logo você pode criar a pasta “admin” dentro dos controllers e criar todos os controllers referentes ao admin (usuarios, produtos, noticias, etc.) e definir uma rota para essa sub-pasta.

      Caso queira ir se adiantando, basta dar uma conferida no User Guide do CI.

      Abs!

  3. ótimos posts! didático e preciso….
    Raphael seria possível por favor futuramente abordar a união entre o cod e smart? ou outro gerenciador cogênero? obrigado.

  4. Bom o problema é para imagens que posições dentro de pastas
    ex.:

    pra não ter de fazer assim

    pois como faço sites pra segundos… fica complicado fazer com urls completas… pois algumas coisas são recicladas para usar em outros projetos.

  5. esqueci que o html aqui num é tratado como texto rs

    img src=”css/imagens/minha_img.jpg”

    pra não ter de fazer assim

    img src=”www.meusite.com.br/css/imagens/minha_img.jpg”

    1. Olá Fabio,

      Voce pode resolver esse problema com o helper url.

      Com a função site_url(‘css/imagens/minha_foto.jpg’) ele pega a URL do site e concatena com o parametro que voce informar.

      1
      
      <img src="<?php echo site_url('css/imagens/minha_foto.jpg') ?>" />

      Abs!

  6. Rafael, primeiramente parabéns pelo seu artigo.

    Aproveitando estou desenvolvendo um site em CODEIGNITER, já consegui resolver várias dúvidas, porém estou parado com uma dúvida de como montar uma url amigável dinamicamente, vou explicar:

    Tenho meu site:
    http://localhost:8080/meusite/

    Tenho que pegar da view a descrição do combo Estado, Cidade e Bairro via POST, isso já faço e funciona, tenho que escrever a url que ficaria assim “http://localhost:8080/meusite/sp-sao-paulo-centro, hoje passo os IDs para a função e me retorna os dados, está funcionando com a url não amigável, mas me parece que tenho que passar para a procedure, ex: ‘sp-saopaulo-centro’ para retornar os mesmos dados que são retornados quando passo os IDs.
    Pergunto como reescrevo a URL e é não acho correto passar a descrição dos campos para a procedure, existe outra forma ?

  7. Boa Noite,

    Gostaria se possível de uma dica. pois bem uso Codeigniter 2.4.1 com o XAMPP e a minha URL só reconhece até o controller, ou seja, só executa a função index, as outras não. O que devo fazer?

    Desde já agradeço.

    Abraços,

    Hérlon

  8. Ola Rafael!
    Estou com um probleminha q não estou conseguindo resolver. Vc poderia me ajudar?
    A questão e o seguinte:
    Tenho uma pagina meu-site.com.br/controller/produto/nome-do-produto
    ate ai tranquilo.
    porem qdo eu acesso este produto, qdo eu vou para outra pagina o CI esta colocando automaticamente nos meus links o controller/produto ex: meu-site.com.br/controller/produto/home ou meu-site.com.br/controller/produto/contato, entendeu?
    outra coisa tbm é q qdo eu estou na pagina meu-site.com.br/controller/produto/nome-do-produto meu CSS não carrega, pq o caminha ele se perde: assets/css/style.css. Se eu clicar no link do css o browser tenta abrir um arquivo em meu-site.com.br/controller/produto/assets/css/style.css e na verdade ele esta em meu-site.com.br/assets/css/style.css

    Se puderes me ajudar te agradeço muito!

    Obrigado!

    1. Olá Wagner,

      O problema é que quem interpreta os links HTML é o navegador (client-side) e mesmo que para o servidor web que está rodando a aplicação ele “entenda” a URL amigável, para o navegador ele imagina que “controller”, “produto” e etc. são sub-pastas. Logo, para chamar a página home voce teria que colocar um href=”../../home” por exemplo. Isso não seria nada viável.

      Como proceder então?

      A solução é colocar nos links URLs absolutas e não relativas (www.seu-site.com.br/home ao invés de home). Existe um helper chamado “url” no CI que ajuda nisso. Você chama a função base_url ou site_url e passa como parâmetro o controller/action que você quer chamar e ele já gera o link com o seu dominio se baseando no seu arquivo config.php. Dê uma olhada em https://ellislab.com/codeigniter/user-guide/helpers/url_helper.html

      Com relação aos CSS/JS, eu crio no cabeçalho da página uma URL base. Aí tudo que for chamado a partir da página toma essa URL como base. Leia sobre em http://www.w3schools.com/tags/tag_base.asp

      Espero que consiga resolver os problemas aí.

      Abs!

  9. Rafael, estou tendo um problema pois quando passo um parâmetro para o controlador a página fica dando “refresh” infinitamente e carregando uma página em baixo da outra.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *