20 ago2011

Criando rotas com Zend Route

por Matias Rezende

Olá galera…

Tudo certo? Começando hoje uma série de posts sobre o Zend_Route. Vamos começar ensinando uma forma de criar rotas personalizadas. Este formato é o mais indicado quanto você tem poucas rotas e estas rotas são simples. Basta adicionar alguns códigos ao seu arquivo application.ini:

resources.router.routes.produto.route = "produto/:categoria/:sub-categoria/:produto"
resources.router.routes.produto.defaults.module = default
resources.router.routes.produto.defaults.controller = produtos
resources.router.routes.produto.defaults.action = show
resources.router.routes.produto.defaults.categoria =
resources.router.routes.produto.defaults.sub-categoria =
resources.router.routes.produto.defaults.produto =

Explicando passo a passo:

resources.router.routes.produto

Indicando ao application.ini que estamos trabalhando com o recurso router e que ali contém uma das rotas (routes), de nome produto. Para definir qualquer informação desta rota, devemos iniciar as linhas com este código.

resources.router.routes.produto.route = "produto/:categoria/:sub-categoria/:produto"

Ao fazermos isto, definimos que todas as URLs que começarem com produto entrarão nesta rota. O primeiro parâmetro após a palavra produto será o parâmetro categoria. O segundo será sub-categoria e o terceiro será o produto.

Definindo os valores padrão (defaults)

Para definirmos para onde será direcionada esta requisição, vamos definir nos valores default.

resources.router.routes.produto.defaults.module = default
resources.router.routes.produto.defaults.controller = produtos
resources.router.routes.produto.defaults.action = show

Aí definimos que qualquer requisição (página) será direcionada para o módulo default, para o controller produtos e para a action show.

Para evitarmos problemas, definimos também os valores default para os parâmetros (categoria, sub-categoria e produto).

Então, transformamos uma URL assim:

http://site.com.br/produtos/show/categoria/informatica/sub-categoria/notebooks/produto/notebook-dell-inspirion-15-r

por uma URL assim:

http://site.com.br/produto/informatica/notebooks/notebook-dell-inspirion-15-r

Melhorou, né?

Vejam que esta é UMA das formas de fazer isto (existem diversas outras).

Gostou? Comentem!!!

12 respostas para “Criando rotas com Zend Route”

  • Alexandre

    Oi Matias, tudo bem? Gostei muito da sua explicação, parabéns!

    Estou tentando criar uma rota no zend e queria uma dica, hoje minha url aparece da seguinte forma:
    http://www.site.com.br/controller/action/parametro/valor/produto

    Eu gostaria de suprimir o /action/parametro/valor/ ou /controller/action/parametro/valor/

    Para aparecer:
    http://www.site.com.br/controller/produto ou http://www.site.com.br/produto

    Tem como?

    • Matias Rezende

      Como seria este “produto”? Para tirar o controller dali só se criar uma regra com expressão regular, que vai depender do que vai em produto.

  • Alexandre

    Oi Matias, respondendo sua pergunta, esse “produto” é um valor que eu busco no banco de dados para melhorar um pouco a legibilidade da url, com a url: http://www.site.com.br/controller/action/parametro/valor/ eu já consigo capturar o que necessito, e o valor produto, é o nome do produto, entende?

    No final das contas meu objetivo é o seguinte:
    Suprimir /controller/action/parametro/valor/ e colocar os valores que eu quiser, exemplo:
    http://www.site.com.br/nomequalquer-1/nomequalquer-2/

  • Camila Bastos

    Olá eu estou com uma dúvida … eu tenho um controller chamado produtos mas só consigo visualizar ele nesta URL:

    http://www.site.com.br/produtos/mostrar/id/1

    eu fiz exatamente como está ali mas não sei como fazer para trocar a URL para ficar

    http://www.site.com.br/produtos/creme-para-a-pele por exemplo …

    Como eu consigo subistituir ou passar um valor que ID 1 é igual a creme-para-a-pele?

    Obrigada

    • Matias Rezende

      Olha, para criar a rota exatamente como você está querendo é mais complicado de fazer. O que eu sugiro é que você troque de /produtos/mostrar/id/1 para /produto/creme-para-a-pele. Veja que eu troquei produtos por produto (sem o s). Aí a rota fica mais fácil de criar, ficando assim:

      resources.router.routes.produto.route = "produto/:id"
      resources.router.routes.produto.defaults.module = default
      resources.router.routes.produto.defaults.controller = produtos
      resources.router.routes.produto.defaults.action = mostrar
      resources.router.routes.produto.defaults.id =
      

      Só que, da forma que você quer (sem colocar o id do produto), o parâmetro id dentro do controller produtos, action mostrar receberá o valor de ‘creme-para-a-pele’. Aí, para localizar este produto você ter que usar este nome. Utilizando o id do produto na frente (1-creme-para-a-pele), basta que você utilize o código abaixo para localizar o produto:

      $id = intval($this->_getParam('id', 0));
      $produto = $model->find($id)->current();// assumindo que $model é o objeto que contém a sua model
      // a partir daqui $produto terá o objeto do seu produto, com base no id que você recebeu pela URL
      

      Porque isto acontece? Ao utilizar o intval(), o PHP tenta converter a string 1-creme-para-a-pele em um número inteiro. Como o primeiro caractere é um número inteiro, ele pega este número e ignora todo o restante da string, deixando apenas o id do produto.

  • Camila Bastos

    Oi de novo! Então Matias eu estive olhando um site que você fez o RIPSOU… olhe esta página http://ripsou.com/eventos/ja-rolou <<< fica o eventos/ja-rolou… acho que o que eu preciso não seria somente com as rotas..

    ex: o meu ficaria eventos/jarolou…

    como queria: eventos/ja-rolou… o route apenas não resolve isto resolve?

    Obrigada novamente! Amei seu blog

    • Matias Rezende

      Obrigado pelo elogio.

      Neste caso que você citou, o ja-rolou é uma action do controller eventos, então acho que não é muito o que você está querendo. Ainda acho que a melhor opção é a que te sugeri no comentário anterior. Se não era aquilo que você estava querendo, tenta explicar melhor, dar mais detalhes de como está a URL hoje, qual controller e action você quer acessar, passando o que como parâmetro e como está no momento.

  • Qual a configuração que faço no Bootstrap?

  • Funcionou! Valeu!

    Que componente é esse que você utilizar para diferenciar as linhas de código no seu post? Estou criando uma intranet na empresa e utiilizo o wordpress. Estou documentando processos de desenvolvimento.

  • Robson Cruz

    Olá Mathias, bem legal suas informações, porém tenho uma grande dúvida, estou aprendendo sobre o ZendFramework e achei ele fantástico, pois a maioria das coisas você tem controle, porém ainda estou na parte estrutural, uma vez que trabalho com desenvolvimento e nós temos um framework feito pela própria empresa, porém como todos imaginavam temos problemas de produtividade. Como o núcleo do nosso sistema está bem definido e vi que com os módulos o Zend já antende, só que ainda tenho um problema que é as aplicações que rodam no nosso framework vou demonstrar com um exemplo de URL:

    http://www.dominioqualquer.com.br//servicos//questionario/id/2

    Sendo que:

    = exemplo: administrativo
    servicos = diretório fixo para subdivisão das aplicações
    = aplicação propriamente dita, exemplo: enquete
    questionario = pasta de questionários da aplicação enquete
    id = parâmetro
    2 = valor

    Será que ficou claro?
    E a principal pergunta o framework da Zend consegue atender tal necessidade?

    Abraços.

Deixe um Comentário

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>