Enrutamiento simple en un motor en PHP
En la lección anterior en nuestro sitio solo había un grupo de URLs. Por supuesto, normalmente un sitio web tiene varios tipos de direcciones.
Cada grupo de direcciones será procesado por su propia expresión regular, que se llaman rutas. En consecuencia, el proceso de coincidencia de rutas y código para su procesamiento se llama enrutamiento.
Supongamos, por ejemplo, que tenemos dos tipos de direcciones. Escribamos una ruta para cada grupo:
<?php
if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
// una página por slug
}
if (preg_match('#^/page/all$#', $url, $params)) {
// lista de todas las páginas
}
?>
Para mayor comodidad, saquemos el código de procesamiento de cada ruta a un archivo 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';
}
?>
Los archivos incluidos deben devolver como resultado un array con el título y el contenido de la página.
Escribamos el código del primer archivo, que muestra una página por su 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;
?>
Y ahora escribamos el código del segundo archivo, que muestra una lista de enlaces a todas las 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 las páginas',
'content' => $content
];
return $page;
?>
Después de ejecutar una de las condiciones, en la variable
$page siempre habrá un array de una
estructura. Usemos este array para
insertar el título y el contenido en la plantilla del sitio:
<?php
$layout = file_get_contents('layout.php');
$layout = str_replace('{{ title }}', $page['title'], $layout);
$layout = str_replace('{{ content }}', $page['content'], $layout);
echo $layout;
?>
Juntemos todo y obtendremos el siguiente 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;
?>
Supongamos que tienes un sitio con usuarios. Crea una página para mostrar un usuario, una página para mostrar todos los usuarios y una página con un formulario para agregar un nuevo usuario.