Roteamento simples em um motor em PHP
Na lição anterior, nosso site tinha apenas um grupo de URLs. Claro, geralmente um site tem vários tipos de endereços.
Cada grupo de endereços será processado por sua própria expressão regular, que são chamadas rotas. Consequentemente, o processo de correspondência de rotas e código para processá-las é chamado de roteamento.
Suponha, por exemplo, que temos dois tipos de endereços. Vamos escrever nossa própria rota para cada grupo:
<?php
if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
// uma página por slug
}
if (preg_match('#^/page/all$#', $url, $params)) {
// lista de todas as páginas
}
?>
Para conveniência, vamos colocar o código de processamento de cada rota em um arquivo separado:
<?php
if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
$page = include 'view/page/show.php';
}
if (preg_match('#^/page/all$#', $url, $params)) {
$page = include 'view/page/all.php';
}
?>
Os arquivos incluídos devem retornar, como resultado, um array com o título e o conteúdo da página.
Vamos escrever o código do primeiro arquivo, que exibe uma única página pelo seu slug:
<?php
$slug = $params[1];
$query = "SELECT * FROM pages WHERE slug='$slug'";
$res = mysqli_query($link, $query) or die(mysqli_error($link));
$page = mysqli_fetch_assoc($res);
return $page;
?>
E agora vamos escrever o código do segundo arquivo, que exibe a lista de links para todas as páginas:
<?php
$query = "SELECT slug, title FROM pages";
$res = mysqli_query($link, $query) or die(mysqli_error($link));
for ($data = []; $row = mysqli_fetch_assoc($res); $data[] = $row);
$content = '';
foreach ($data as $page) {
$content .= '
<div>
<a href="/page/' . $page['slug'] . '">' . $page['title'] . '</a>
</div>
';
}
$page = [
'title' => 'todas as páginas',
'content' => $content
];
return $page;
?>
Após a execução de uma das condições, a variável
$page sempre será um array com uma
estrutura. Vamos usar este array para
substituir o título e o conteúdo no template do site:
<?php
$layout = file_get_contents('layout.php');
$layout = str_replace('{{ title }}', $page['title'], $layout);
$layout = str_replace('{{ content }}', $page['content'], $layout);
echo $layout;
?>
Vamos juntar tudo e obter o seguinte código:
<?php
$url = $_SERVER['REQUEST_URI'];
if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
$page = include 'view/page/show.php';
}
if (preg_match('#^/page/all$#', $url, $params)) {
$page = include 'view/page/all.php';
}
$layout = file_get_contents('layout.php');
$layout = str_replace('{{ title }}', $page['title'], $layout);
$layout = str_replace('{{ content }}', $page['content'], $layout);
echo $layout;
?>
Suponha que você tem um site com usuários. Crie uma página para mostrar um usuário, uma página para listar todos os usuários e uma página com um formulário para adicionar um novo usuário.