Απλή Δρομολόγηση στη Μηχανή σε PHP
Στο προηγούμενο μάθημα στον ιστότοπό μας υπήρχε μόνο μία ομάδα URLs. Φυσικά, συνήθως σε έναν ιστότοπο υπάρχουν διάφοροι τύποι διευθύνσεων.
Κάθε ομάδα διευθύνσεων θα επεξεργάζεται με τη δική της κανονική έκφραση, οι οποίες ονομάζονται routes. Αντίστοιχα η διαδικασία αντιστοίχισης routes και κώδικα για την επεξεργασία τους ονομάζεται routing.
Ας υποθέσουμε, για παράδειγμα, ότι έχουμε δύο τύπους διευθύνσεων. Ας γράψουμε για κάθε ομάδα το δικό της route:
<?php
if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
// μία σελίδα από το slug
}
if (preg_match('#^/page/all$#', $url, $params)) {
// λίστα όλων των σελίδων
}
?>
Για ευκολία, ας βγάλουμε τον κώδικα επεξεργασίας κάθε route σε ξεχωριστό αρχείο:
<?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';
}
?>
Ωα αποτέλεσμα, τα αρχεία που περιλαμβάνονται πρέπει να επιστρέφουν έναν πίνακα με τον τίτλο και το περιεχόμενο της σελίδας.
Ας γράψουμε τον κώδικα του πρώτου αρχείου, που εμφανίζει μία σελίδα από το 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;
?>
Και τώρα ας γράψουμε τον κώδικα του δεύτερου αρχείου, που εμφανίζει τη λίστα συνδέσμων για όλες τις σελίδες:
<?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' => 'all pages',
'content' => $content
];
return $page;
?>
Μετά την εκτέλεση μιας από τις συνθήκες στη μεταβλητή
$page πάντα θα υπάρχει ένας πίνακας από μία
δομή. Ας χρησιμοποιήσουμε αυτόν τον πίνακα για να
τοποθετήσουμε τον τίτλο και το περιεχόμενο στο template του ιστότοπου:
<?php
$layout = file_get_contents('layout.php');
$layout = str_replace('{{ title }}', $page['title'], $layout);
$layout = str_replace('{{ content }}', $page['content'], $layout);
echo $layout;
?>
Ας τα ενώσουμε όλα μαζί και θα πάρουμε τον ακόλουθο κώδικα:
<?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;
?>
Ας υποθέσουμε ότι έχετε έναν ιστότοπο με χρήστες. Δημιουργήστε μια σελίδα για την εμφάνιση ενός χρήστη, μια σελίδα για την εμφάνιση όλων των χρηστών και μια σελίδα με φόρμα για την προσθήκη νέου χρήστη.