Usando rotas no PHP sem frameworks
Configure as rotas do seu sistema com PHP e Apache
Créditos
Eu não estaria escrevendo esse artigo se meses atrás eu não tivesse lido o The Simplest PHP Router da Tania Rascia, 80% do que vocês vão ler aqui veio desse artigo e os outros 20% são algumas mudanças e considerações minhas.
Objetivo
O objetivo é uma aplicação muito simples com três páginas: Home (/), About (/about) e Contact(/contact), não vamos desenvolver uma API, vamos retornar páginas HTML nos endpoints.
Não vou usar Composer, autoload ou coisas do tipo, vamos trabalhar apenas com orientação a objetos básica, mas se você quiser, pode incrementar o sistema depois.
Estrutura
A estrutura de arquivos e diretórios será a seguinte
.htaccess
index.php
Router.php
RouteSwitch.php
pages/
|_ home.html
|_ about.html
|_ contact.html
|_ not-found.html
Configuração
Mão no teclado! Vamos configurar o Apache!
A configuração do Apache se dá pelo arquivo .htaccess
na raíz do projeto, o que vamos fazer nele é configurar as rotas e redirecionar todas as requisições para o nosso futuroindex.php
RouteSwitch
O RouteSwitch vai ser responsável por retornar a ação esperada para cada rota, por exemplo: Ao acessarmos ‘/’ queremos receber a página Home, ele é o cara que nos vai trazer ela.
Se trata de uma classe abstrata que vai ser extendida futuramente, a idéia é que ela tenha um método para cada rota do sistema, e esse método irá executar a ação esperada (que é retornar a página html).
A classe deve ficar mais ou menos assim:
Repare na relação rota-método, os método são nomeados de acordo com sua respectiva rota.
O método mágico __call()
será executado sempre que chamarmos um método/rota não existente, ele vai retornar um 404.
Router
A classe Router tem a responsabilidade de receber a URI passada e chamar o método correspondente do RouteSwitch.
Pra evitar vários ifs
ou switch/case
vamos usar uma espécie de ‘Object Literals’, vamos fazer o seguinte:
- Limpar a URI passada com o
substr()
- Guardar o resultado dentro de uma variável
- Chamar a variável como método do RouteSwitch
Veja o exemplo a seguir:
$uri = '/about';
$route = substr($uri, 1); // Equivalente à: $route = 'about'$routeSwitch = new RouteSwitch;
$routeSwitch->$route(); // Equivalente à: $routeSwitch->about();
Usando essa técnica, vamos poupar muitas linhas, deixar o código mais dinâmico e simples de entender. A classe Router vai ficar assim:
Como estamos removendo a primeira letra da uri, quando acessarmos / (página home) vamos ficar com uma string vazia ‘’
, o if
verifica isso, e se for true, vai chamar o método home do RouterSwitch.
Vale ressaltar que o uso do substr()
está quebrando o SRP, estamos fazendo um tratamento de string em um método que só deveria chamar a função correta do RouteSwitch, mas isso é só um exemplo.
Index
Finalmente, chegamos ao index! O index.php vai ser o primeiro arquivo a ser chamado, ele vai ser responsável por passar a URI digitada para nossa classe Router.
As páginas
Em relação ao HTML vou colocar apenas um h1
com o nome da página.
Conclusão
Bom, é isso. Agradeço por ter acompanhado até aqui, o que eu quis passar é o ‘esqueleto’ de um router no PHP livre de frameworks ou composer require
, com o que tem aqui você pode ir bem além.
Não deixe de ler a documentação do htaccess no site do Apache, também a documentação do PHP caso tenha alguma dúvida do código.
Espero ter ajudado, bons estudos!