Com estruturas PHP, por que o conceito de "rota" é usado?

31

A razão pela qual pergunto isso é porque um script PHP não é uma rota? Por exemplo, se você possui um article.php, sua rota é simplesmente http://mysite.com/article.php .

Por que abstrair ainda mais o conceito de uma rota quando ela já existe como um arquivo simples?

Ryan
fonte

Respostas:

44

Para entender o que um roteador faz, você deve primeiro entender o que é um mecanismo de reescrita. Do artigo da Wikipedia (ênfase minha):

Um mecanismo de reescrita é um software que modifica a aparência de uma URL da Web (reescrita de URL). URLs reescritos (às vezes conhecidos como URLs curtos, sofisticados ou compatíveis com mecanismos de pesquisa - SEF) são usados ​​para fornecer links mais curtos e relevantes para as páginas da Web. A técnica adiciona um grau de separação entre os arquivos usados ​​para gerar uma página da Web e a URL que é apresentada ao mundo .

Quando um mecanismo de reescrita é usado, você não tem uma correlação 1: 1 entre a URL e um script PHP. Um exemplo do mesmo artigo:

http://example.com/wiki/index.php?title=Page_title

pode ser reescrito como:

http://example.com/wiki/Page_title

Existem vários benefícios em usar a técnica. Como o PHP geralmente é fortemente associado ao Apache, o mecanismo de reescrita mais usado é o mod_rewrite do Apache .

Se você deseja reescrever URLs, precisa de algum tipo de roteamento, pois o roteamento é o processo de pegar o URL, dividi-lo em componentes e decidir qual é o script real a ser chamado. A página de documentação do roteador padrão do Zend Framework explica o processo como:

O roteamento é o processo de obter um ponto de extremidade do URI (a parte do URI que vem após a URL base) e decompô-lo em parâmetros para determinar qual módulo, controlador e ação desse controlador deve receber a solicitação.

Atualmente, a maioria das estruturas PHP são baseadas no padrão MVC e, em uma estrutura MVC, o processo é mais ou menos assim * :

  1. O navegador está apontado para um URL,
  2. O servidor da Web captura a solicitação e a encaminha para um ponto de entrada comum, geralmente um index.phpscript,
  3. index.php obtém o URL e inicia o processo de roteamento.
  4. O URL é decomposto em parâmetros, onde o primeiro é o controlador, o segundo é o método de ação e o restante são considerados parâmetros dinâmicos,
  5. Se existir uma classe de controlador que corresponda ao primeiro parâmetro, um objeto do controlador será instanciado,
  6. O método de ação que geralmente é uma função do objeto do controlador é chamado e seu retorno é o que realmente retornou ao navegador.

A correspondência de parâmetros com controladores e métodos geralmente emprega a correspondência por meio de expressões regulares para poder lidar com padrões de roteamento complexos e dinâmicos, conhecidos como rotas. Bons exemplos de rotas podem ser encontrados na página de documentação de Roteamento de URI do CodeIgniter :

$ route ['journals'] = "blogs";

$ route ['blog / joe'] = "blogs / usuários / 34";

$ route ['product / (: any)'] = "catalog / product_lookup";

$ route ['product / (: num)'] = "catalog / product_lookup_by_id / $ 1";

A $routematriz mantém os padrões como chaves e as ações resultantes como valores em controller/action_method/dynamic_parameterformato.

* Isso não pretende ser uma descrição do processo canônico, apenas uma explicação simplificada.

yannis
fonte
15
Deveria haver um distintivo para descrever um roteador mvc sem usar nenhum derivado de "dispatch" ...
yannis