Usando rotas no PHP sem frameworks

Configure as rotas do seu sistema com PHP e Apache

Gabriel Albuquerque (Albuca)
3 min readDec 4, 2020
Imagem de fundo pro Francesco Paggiaro em Pexels: https://www.pexels.com/@paggiarofrancesco

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:

  1. Limpar a URI passada com o substr()
  2. Guardar o resultado dentro de uma variável
  3. 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!

--

--

Responses (2)