Routing semplice nel motore in PHP
Nella lezione precedente sul nostro sito c'era solo un gruppo di URL. Naturalmente, di solito un sito ha diversi tipi di indirizzi.
Ogni gruppo di indirizzi sarà gestito con la propria espressione regolare, che sono chiamate route. Di conseguenza, il processo di corrispondenza delle route e del codice per la loro gestione si chiama routing.
Supponiamo, ad esempio, di avere due tipi di indirizzi. Scriviamo una route per ogni gruppo:
<?php
if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
// una pagina per slug
}
if (preg_match('#^/page/all$#', $url, $params)) {
// elenco di tutte le pagine
}
?>
Per comodità, spostiamo il codice di gestione di ogni route in un file separato:
<?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';
}
?>
I file inclusi devono restituire come risultato un array con il titolo e il contenuto della pagina.
Scriviamo il codice del primo file, che mostra una singola pagina in base al suo 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;
?>
Ora scriviamo il codice del secondo file, che mostra un elenco di link a tutte le pagine:
<?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' => 'tutte le pagine',
'content' => $content
];
return $page;
?>
Dopo l'esecuzione di una delle condizioni, nella variabile
$page ci sarà sempre un array con una
struttura. Usiamo questo array per
sostituire il titolo e il contenuto nel template del sito:
<?php
$layout = file_get_contents('layout.php');
$layout = str_replace('{{ title }}', $page['title'], $layout);
$layout = str_replace('{{ content }}', $page['content'], $layout);
echo $layout;
?>
Mettiamo tutto insieme e otteniamo il seguente codice:
<?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;
?>
Supponiamo di avere un sito con utenti. Crea una pagina per mostrare un singolo utente, una pagina per elencare tutti gli utenti e una pagina con un modulo per aggiungere un nuovo utente.