[Introdução ao PHP] Alterne Páginas Livremente! Entendendo o Mecanismo ao Criar um Roteador Simples
Com o que aprendemos até agora, já somos capazes de obter informações de um banco de dados usando PHP e gerar páginas dinâmicas. No entanto, é normal que um site tenha várias páginas diferentes, como "Página Inicial", "Sobre Nós" e "Contato". Como podemos gerenciar eficientemente essas páginas, compartilhando elementos comuns como cabeçalhos e rodapés?
A resposta está em um conceito chamado "roteamento" (routing). O roteamento é um mecanismo que atua como "controle de tráfego", alternando o conteúdo a ser exibido de acordo com a URL que o usuário acessou. Neste artigo, criaremos um roteador muito simples em PHP usando parâmetros de URL como `index.php?page=about`. Ao tocar na parte central do que frameworks completos como o Laravel fazem nos bastidores, aprofundaremos nossa compreensão da estrutura de aplicações web e daremos um grande passo para o nosso próximo aprendizado!
Para preparar seu ambiente para rodar o PHP (ambiente de desenvolvimento), se você ainda não configurou o XAMPP, por favor, consulte [Introdução ao PHP] Um Guia Completo para Baixar e Instalar o XAMPP!. Após a instalação, basta colocar seu arquivo PHP na pasta especificada (como `htdocs`), e você estará pronto!
1. O que é o Mecanismo de Roteamento? Controle de Tráfego com PHP
O mecanismo de roteamento pode ser comparado a um recepcionista em um grande edifício. Todos os visitantes (usuários) chegam primeiro à mesma entrada principal (index.php). Então, eles dizem ao recepcionista (roteador) "Quero ir para o departamento XX (?page=about)". O recepcionista, então, os guia para o departamento apropriado (about.php) de acordo com o seu destino.
Para criar este mecanismo, usaremos os três elementos a seguir do PHP.
- Variável
$_GET: Uma variável especial do PHP para receber o valor de `page` (neste caso, `about`) de uma "string de consulta" como?page=aboutanexada ao final da URL. - Instrução
include: Um comando para ler e combinar o conteúdo de outro arquivo PHP em um local especificado. Isso permite que você compartilhe elementos comuns como cabeçalhos e rodapés. - Função
file_exists(): Uma função de segurança muito importante que verifica se o arquivo que você está tentando carregar realmente existe no servidor, caso uma URL maliciosa seja especificada.
Ao combinar essas partes, um roteador que alterna o conteúdo da tela de acordo com a URL é concluído.
2. Na Prática! Criando um Roteador Simples com 3 Arquivos
Agora, vamos criar um roteador simples. Desta vez, prepararemos os três arquivos a seguir e os salvaremos todos na mesma pasta.
- index.php: O layout que serve como esqueleto para todas as páginas e o próprio roteador que lida com o controle de tráfego.
- home.php: A parte do conteúdo a ser exibida como a página inicial.
- about.php: A parte do conteúdo a ser exibida como a página "Sobre este site".
Arquivo 1: index.php (Roteador e Layout)
Este arquivo é a "entrada principal" do nosso site. Ele tem partes comuns como navegação e uma área de exibição de conteúdo que muda de acordo com a URL. Este será o nosso "exemplo de HTML completo e funcional".
<!DOCTYPE html>
<html lang="pt">
<head>
<meta charset="UTF-8">
<title>Site com Roteador Simples</title>
<style>
body { font-family: sans-serif; line-height: 1.8; }
.container { max-width: 800px; margin: 20px auto; padding: 20px; border: 1px solid #ddd; }
nav { background: #f0f0f0; padding: 10px; margin-bottom: 20px; }
nav a { margin-right: 15px; text-decoration: none; color: #0056b3; }
nav a:hover { text-decoration: underline; }
.content { border-top: 2px solid #eee; padding-top: 20px; }
footer { margin-top: 30px; text-align: center; font-size: 0.9em; color: #777; }
.not-found { color: red; font-weight: bold; }
</style>
</head>
<body>
<div class="container">
<header>
<h1>Site de Exemplo com Roteador Simples</h1>
</header>
<nav>
<a href="index.php?page=home">Início</a>
<a href="index.php?page=about">Sobre este site</a>
</nav>
<div class="content">
<?php
// 1. Obter o nome da página a ser exibida a partir do parâmetro da URL
// Se não houver parâmetro, 'home' é o padrão
$page = $_GET['page'] ?? 'home';
// 2. Lista de páginas permitidas (lista de permissões)
$allowed_pages = ['home', 'about'];
// 3. Verificar se o nome da página está na lista de permissões
if (in_array($page, $allowed_pages)) {
// 4. Criar o caminho do arquivo correspondente
$file_path = $page . '.php';
// 5. Verificação final se o arquivo existe antes de incluí-lo
if (file_exists($file_path)) {
include($file_path);
} else {
echo '<p class="not-found">Erro: Arquivo não encontrado.</p>';
}
} else {
// Se uma página não permitida for especificada
echo '<p class="not-found">404 Not Found: A página especificada não existe.</p>';
}
?>
</div>
<footer>
<p>© 2025 Simple Router Inc.</p>
</footer>
</div>
</body>
</html>
Arquivo 2: home.php (Conteúdo da Página Inicial)
Este é um arquivo que contém apenas o conteúdo da página inicial (top page), que será incluído no `index.php`.
<h2>Bem-vindo!</h2>
<p>Esta é a página inicial.</p>
<p>Quando você clica na navegação acima, o valor de ?page= na URL muda, e o conteúdo exibido é alterado.</p>
Arquivo 3: about.php (Conteúdo Sobre o Site)
Da mesma forma, este é o conteúdo que é carregado quando `index.php?page=about` é especificado.
<h2>Sobre este site</h2>
<p>Este site é uma amostra para aprender o mecanismo de um roteador simples em PHP.</p>
<p>O index.php serve como base, e carrega dinamicamente o conteúdo de diferentes arquivos como este about.php de acordo com o parâmetro da URL.</p>
Agora está tudo pronto. Tente acessar `index.php` em seu navegador. Você deve conseguir confirmar que cada vez que clica em um link de navegação, apenas o conteúdo central alterna entre "Início" e "Sobre este site".
3. Um Ponto a Ser Observado: Ataque de Travessia de Diretório
Ao criar um roteador simples por conta própria, uma coisa que você absolutamente deve saber é o ataque de **Travessia de Diretório (Directory Traversal)**. Se você escrever um código como o seguinte sem medidas de segurança, é muito perigoso.
<?php
// Exemplo ruim: Nunca imite isso!
$page = $_GET['page'];
include($page . '.php'); // Usando a entrada do usuário como está, sem validação
?>
Com este código, um invasor poderia especificar uma string especial na URL como `?page=../../../../etc/passwd`, potencialmente permitindo-lhes ler arquivos de configuração importantes do servidor que não deveriam ser acessados.
Para prevenir este ataque, nosso exemplo de `index.php` inclui uma verificação de duas etapas.
- Método de Lista de Permissões (Whitelist): Criar uma lista de permissões chamada `$allowed_pages` e verificar se o nome da página especificada está nela usando `in_array()`.
- Verificação de Existência do Arquivo: Mesmo que passe pela lista de permissões, como precaução, realizar uma verificação final para ver se o arquivo realmente existe com `file_exists()`.
Essa contramedida impede que arquivos não intencionais sejam carregados e aumenta a segurança.
4. Resumo e Próximos Passos
Desta vez, aprendemos o mecanismo de um roteador simples que alterna o conteúdo exibido usando parâmetros de URL e a instrução `include` do PHP. Você conseguiu ter uma noção de como um site inteiro pode ser construído com um único ponto de entrada, `index.php`, que lida com o controle de tráfego de acordo com a URL?
Na verdade, os frameworks modernos de PHP que usamos comumente, como Laravel e Symfony, fornecem uma versão mais avançada e segura deste mecanismo de roteamento. O conhecimento deste artigo é uma base importante para entender por que tais frameworks são necessários e o que está acontecendo por trás das cenas.
Como próximo passo, seria interessante tentar criar "**URLs amigáveis**" (pretty URLs) reescrevendo as URLs com um arquivo `.htaccess`, para tornar URLs como `index.php?page=about` mais bonitas, como `/about`. Isso certamente aprofundará sua compreensão de como a web funciona.