Neste guia, vamos explorar como construir um roteador PHP simples sem a necessidade de um framework completo. Um roteador é essencial para direcionar solicitações HTTP para os controladores corretos em sua aplicação, proporcionando URLs limpas e amigáveis para SEO.
Benefícios de Usar um Roteador
- URLs limpas e amigáveis para SEO
- Melhor organização do código
- Facilidade de manutenção
- Maior segurança
Estrutura do Projeto
Primeiro, vamos definir uma estrutura de projeto organizada:
meu-projeto/
├── public/
│ ├── index.php
│ └── .htaccess
├── src/
│ ├── Roteador.php
│ └── Controladores/
│ ├── HomeController.php
│ └── UsuarioController.php
└── views/
└── home.php
Criando a Classe Roteador
Aqui está um exemplo básico de uma classe Roteador:
<?php
namespace App;
class Roteador
{
private array $rotas = [];
public function get(string $caminho, callable|array $callback): void
{
$this->rotas['GET'][$caminho] = $callback;
}
public function post(string $caminho, callable|array $callback): void
{
$this->rotas['POST'][$caminho] = $callback;
}
public function resolver(): mixed
{
$metodo = $_SERVER['REQUEST_METHOD'];
$caminho = $_SERVER['REQUEST_URI'] ?? '/';
$caminho = explode('?', $caminho)[0];
$callback = $this->rotas[$metodo][$caminho] ?? null;
if ($callback === null) {
http_response_code(404);
return "404 Não Encontrado";
}
if (is_array($callback)) {
[$classe, $metodo] = $callback;
$controlador = new $classe();
return $controlador->$metodo();
}
return $callback();
}
}
Configurando o Ponto de Entrada
O arquivo public/index.php
será nosso ponto de entrada:
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use App\Roteador;
use App\Controladores\HomeController;
use App\Controladores\UsuarioController;
$roteador = new Roteador();
// Definindo rotas
$roteador->get('/', [HomeController::class, 'index']);
$roteador->get('/sobre', [HomeController::class, 'sobre']);
$roteador->get('/usuarios', [UsuarioController::class, 'index']);
// Resolvendo a requisição atual
echo $roteador->resolver();
Considerações de Segurança
É crucial validar e sanitizar entradas e implementar cabeçalhos de segurança:
header("X-Content-Type-Options: nosniff");
header("X-Frame-Options: DENY");
header("X-XSS-Protection: 1; mode=block");
Conclusão
Construir seu próprio roteador PHP é uma ótima maneira de entender o funcionamento interno dos frameworks modernos. Este roteador simples oferece uma base sólida que pode ser expandida conforme as necessidades do seu projeto.
Próximos Passos
- Adicionar suporte a middleware
- Implementar grupos de rotas
- Adicionar rotas nomeadas
- Implementar cache para melhor desempenho