Construindo um Roteador HTTP Orientado a Objetos sem Frameworks em PHP

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ção parse_url() com a constante PHP_URL_PATH garante 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).

Thales de Oliveira Gomes

Thales de Oliveira Gomes é gestor de Tecnologia da Informação, especialista em infraestrutura de redes, computação em nuvem e operações de TI hospitalar, com mais de 18 anos de experiência na área. Graduado em Gestão de TI e pós-graduado em Engenharia de Redes e Telecomunicações, Cloud Computing, Redes de Computadores e Gestão Hospitalar, construiu uma trajetória sólida liderando projetos de alta complexidade, como a implementação e migração para nuvem de sistemas ERP de grande porte. Sua atuação no setor o levou a ser indicado ao prêmio IT Leaders Brasil na categoria Rising Leaders. Além da carreira corporativa e da paixão por tecnologia, Thales é autor independente com mais de 70 obras publicadas sobre redes, segurança da informação, Linux e física, além de criador de conteúdo no blog Vetor Tech e na plataforma CiberDicas. No universo das artes e do entretenimento, atua como produtor de música eletrônica sob o projeto Yknex, cria ilustrações digitais e compartilha walkthroughs de games no YouTube.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *