Como criar rotas em PHP de forma profissional

COMPARTILHAR:

Quando se trata de desenvolvimento web em PHP, um dos aspectos fundamentais é o gerenciamento de rotas. As rotas são responsáveis por mapear URLs específicas para funcionalidades no backend, direcionando solicitações para os controladores corretos e fornecendo uma experiência de usuário fluida e organizada. Este artigo abordará como criar rotas em PHP de forma profissional e do jeito certo, cobrindo desde conceitos básicos até boas práticas e exemplos de código.

Leia também: Código limpo em PHP

Entendendo o que são rotas

Antes de mergulharmos na implementação, é crucial entender o que são rotas e por que elas são tão importantes. Em termos simples, uma rota é um caminho que define como o servidor deve responder a uma determinada URL. Quando um usuário acessa uma URL, o servidor precisa saber qual arquivo PHP executar e qual lógica aplicar. Isso é gerenciado pelas rotas.

Por exemplo, se você tem uma URL como https://meusite.com/contato, você precisará configurar uma rota que associe essa URL a uma função ou método que gere a página de contato. Sem um sistema de roteamento, o desenvolvimento de aplicações web escaláveis e bem organizadas seria muito mais complexo e propenso a erros.

fullstack pro - sujeito programador

Criando um sistema de rotas básico

O primeiro passo para criar um sistema de roteamento em PHP é entender a estrutura básica de uma rota. Vamos começar com um exemplo simples:

<?php

// Definindo um array de rotas
$rotas = [
    '/' => 'home.php',
    '/contato' => 'contato.php',
    '/sobre' => 'sobre.php',
];

// Obtendo a URI da requisição
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

// Verificando se a URI existe no array de rotas
if (array_key_exists($uri, $rotas)) {
    include $rotas[$uri];
} else {
    // Retorna uma página 404 se a rota não for encontrada
    include '404.php';
}
?>

Nesse exemplo, criamos um array $rotas onde as chaves são os caminhos da URL e os valores são os arquivos PHP que devem ser incluídos quando essa rota é acessada. A URI da solicitação é obtida usando $_SERVER['REQUEST_URI'], e em seguida, verificamos se essa URI existe no array de rotas. Se a rota existir, o arquivo correspondente é incluído; caso contrário, uma página 404 é exibida.

Esse é um exemplo muito básico, mas ilustra o conceito fundamental de roteamento. No entanto, na prática, é necessário algo mais robusto e flexível.

Leia também: 20 funções PHP que você precisa conhecer

Implementando roteamento com orientação a objetos

Para criar um sistema de rotas mais profissional, vamos adotar a Programação Orientada a Objetos (POO). Um sistema de roteamento orientado a objetos oferece maior modularidade, reusabilidade e manutenção. Vamos começar criando uma classe Router:

<?php

class Router
{
    private $rotas = [];

    public function addRoute($metodo, $uri, $callback)
    {
        $this->rotas[] = [
            'metodo' => $metodo,
            'uri' => $uri,
            'callback' => $callback,
        ];
    }

    public function dispatch()
    {
        $requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
        $requestMethod = $_SERVER['REQUEST_METHOD'];

        foreach ($this->rotas as $rota) {
            if ($rota['uri'] === $requestUri && $rota['metodo'] === $requestMethod) {
                return call_user_func($rota['callback']);
            }
        }

        // Se nenhuma rota corresponder, retorna um 404
        http_response_code(404);
        echo '404 - Página não encontrada';
    }
}
?>

Aqui, criamos uma classe Router com métodos para adicionar rotas (addRoute) e despachar a rota correta com base na URI e no método HTTP (dispatch). O método addRoute permite definir rotas para diferentes métodos HTTP, como GET ou POST, e associar essas rotas a um callback, que pode ser uma função ou um método de uma classe.

Vamos adicionar algumas rotas para ilustrar:

<?php

$router = new Router();

// Adicionando uma rota GET para a página inicial
$router->addRoute('GET', '/', function () {
    echo 'Bem-vindo à página inicial!';
});

// Adicionando uma rota GET para a página de contato
$router->addRoute('GET', '/contato', function () {
    echo 'Página de contato';
});

// Adicionando uma rota POST para processar o formulário de contato
$router->addRoute('POST', '/contato', function () {
    // Lógica para processar o formulário de contato
    echo 'Formulário enviado com sucesso!';
});

// Despachando a rota
$router->dispatch();
?>

Nesse exemplo, estamos definindo três rotas: uma para a página inicial, outra para exibir o formulário de contato, e uma terceira para processar o formulário de contato enviado via POST. A função dispatch() é chamada para determinar qual rota deve ser executada com base na solicitação do usuário.

Utilizando expressões regulares para roteamento dinâmico

Em aplicações reais, muitas vezes você precisará de rotas dinâmicas, onde parte da URI pode variar, como um ID de usuário ou um slug de postagem. Podemos estender o roteamento para suportar expressões regulares, permitindo rotas dinâmicas.

Vamos modificar nossa classe Router para suportar isso:

<?php

class Router
{
    private $rotas = [];

    public function addRoute($metodo, $uri, $callback)
    {
        $this->rotas[] = [
            'metodo' => $metodo,
            'uri' => $uri,
            'callback' => $callback,
        ];
    }

    public function dispatch()
    {
        $requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
        $requestMethod = $_SERVER['REQUEST_METHOD'];

        foreach ($this->rotas as $rota) {
            $pattern = preg_replace('#\{[a-zA-Z0-9_]+\}#', '([a-zA-Z0-9_-]+)', $rota['uri']);
            if (preg_match('#^' . $pattern . '$#', $requestUri, $matches) && $rota['metodo'] === $requestMethod) {
                array_shift($matches); // Remove o primeiro elemento, que é a URI completa
                return call_user_func_array($rota['callback'], $matches);
            }
        }

        http_response_code(404);
        echo '404 - Página não encontrada';
    }
}
?>

Agora, ao adicionar uma rota, você pode definir partes variáveis da URI usando chaves {}:

<?php

$router = new Router();

// Rota dinâmica para um perfil de usuário
$router->addRoute('GET', '/usuario/{id}', function ($id) {
    echo "Perfil do usuário com ID: $id";
});

// Rota dinâmica para uma postagem
$router->addRoute('GET', '/postagem/{slug}', function ($slug) {
    echo "Exibindo postagem: $slug";
});

$router->dispatch();
?>

Aqui, {id} e {slug} são partes dinâmicas da URI que podem variar. Quando uma URL correspondente é acessada, o valor capturado é passado como argumento para o callback.

Conclusão

Ao desenvolver um sistema de roteamento em PHP, algumas boas práticas devem ser seguidas para garantir que sua aplicação seja escalável, fácil de manter e segura:

  • Validação e Sanitização: Sempre valide e sanitize os parâmetros recebidos pela URL para evitar injeções de código e outros ataques.
  • Modularização: Divida suas rotas em módulos ou arquivos separados para manter o código organizado, especialmente em aplicações maiores.
  • Rotas RESTful: Se estiver desenvolvendo uma API, siga os princípios RESTful ao definir suas rotas, utilizando métodos HTTP apropriados como GET, POST, PUT e DELETE.
  • Middlewares: Utilize middlewares para gerenciar funcionalidades transversais como autenticação, logging e controle de acesso.
  • Testes: Implemente testes unitários para garantir que suas rotas funcionem conforme o esperado em diferentes cenários.

Criar um sistema de roteamento profissional em PHP não é apenas sobre escrever código que funcione, mas sobre escrever código que seja escalável, fácil de manter e seguro. Ao aplicar as técnicas discutidas neste artigo, você estará bem encaminhado para desenvolver aplicações web robustas e organizadas.

Essas práticas são fundamentais para garantir que sua aplicação cresça sem comprometer a qualidade do código ou a experiência do usuário. Se você está desenvolvendo um projeto maior, considere utilizar frameworks populares como Laravel ou Symfony, que já possuem sistemas de roteamento avançados e prontos para uso.

Agora que você tem uma boa compreensão de como criar rotas em PHP de forma profissional, pode começar a implementar essas práticas em seus projetos e melhorar a arquitetura e a organização do seu código.

COMPARTILHAR:
brayan

Brayan Monteiro

Bacharel em Sistemas de Informação pela Faculdade Maurício de Nassau e desenvolvedor PHP. Além de programador, produzo conteúdo e gerencio blogs. Sou especialista em desenvolvimento de software, SEO de sites e em negócios digitais.