Construindo um Roteador HTTP Orientado a Objetos sem Frameworks em PHP
Desenvolver um roteador HTTP do zero é excelente para entender o funcionamento interno de frameworks modernos e criar micro-aplicações leves em PHP. Esta implementação puramente orientada a objetos mapeia URLs e métodos HTTP para suas respectivas rotas e funções de callback de forma simples e escalável.
PHP
<?php
/**
* Roteador HTTP simples baseado em rotas registradas por métodos HTTP.
*/
class Router
{
private array $routes = [];
/**
* Registra uma rota na tabela de roteamento.
*/
public function addRoute(string $method, string $path, callable $handler): void
{
// Normaliza o método para maiúsculas e remove barras duplicadas do caminho
$method = strtoupper($method);
$path = '/' . trim($path, '/');
$this->routes[$method][$path] = $handler;
}
/**
* Captura a requisição atual e executa a função associada à rota.
*/
public function dispatch(string $requestMethod, string $requestUri): void
{
$method = strtoupper($requestMethod);
// Extrai apenas o caminho da URL, ignorando parâmetros Query String (?id=1)
$path = '/' . trim(parse_url($requestUri, PHP_URL_PATH), '/');
if (isset($this->routes[$method][$path])) {
call_user_func($this->routes[$method][$path]);
return;
}
// Retorna cabeçalho 404 caso nenhuma rota corresponda à requisição
http_response_code(404);
echo json_encode(['error' => 'Rota não encontrada']);
}
}
// --- Exemplo de Uso Prático ---
$router = new Router();
// Mapeamento de rotas da aplicação
$router->addRoute('GET', '/', function() {
echo json_encode(['status' => 'API rodando com sucesso!']);
});
$router->addRoute('GET', '/produtos', function() {
echo json_encode(['produtos' => ['Notebook', 'Mouse', 'Teclado']]);
});
$router->addRoute('POST', '/produtos', function() {
http_response_code(201);
echo json_encode(['message' => 'Produto criado com sucesso']);
});
// Simulação de requisições HTTP do servidor ($_SERVER['REQUEST_METHOD'] e $_SERVER['REQUEST_URI'])
$simulatedMethod = 'GET';
$simulatedUri = '/produtos?categoria=eletronicos';
// Dispara o processamento da rota solicitada
$router->dispatch($simulatedMethod, $simulatedUri);
- Tratamento de Query Strings (
parse_url): O uso da funçãoparse_url()com a constantePHP_URL_PATHgarante que parâmetros passados na URL (como?busca=php) não quebrem o casamento da rota. - Invocação Flexível de Callbacks (
call_user_func): Permite utilizar funções anônimas (closures), métodos estáticos ou métodos de classes injetados como manipuladores válidos de rota. - Mapeamento por Método HTTP: As rotas são organizadas internamente em um array bidimensional agrupado por verbos HTTP (
GET,POST,PUT,DELETE), evitando colisões entre endpoints com o mesmo caminho. - Escopo e Extensibilidade: Esta implementação básica cobre correspondências exatas de URLs; para suporte a parâmetros dinâmicos (como
/usuarios/{id}), é necessário evoluir a checagem de caminhos usando expressões regulares (preg_match).
