Yksinkertainen reititys PHP-moottorissa
Edellisessä oppitunnilla sivustollamme oli vain yksi URL-ryhmä. Tietysti tavallisesti sivustolla on useita erityyppisiä osoitteita.
Jokainen osoiteryhmä käsitellään omalla säännöllisellä lausekkeellaan, joita kutsutaan reiteiksi. Vastaavasti reittien ja niiden käsittelykoodin yhdistämisprosessia kutsutaan reititykseksi.
Oletetaan esimerkiksi, että meillä on kaksi tyyppiä osoitteita. Kirjoitetaan jokaiselle ryhmälle oma reittinsä:
<?php
if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
// yksi sivu slug:n perusteella
}
if (preg_match('#^/page/all$#', $url, $params)) {
// lista kaikista sivuista
}
?>
Mukavuuden vuoksi erotetaan jokaisen reitin käsittelykoodi omaan tiedostoonsa:
<?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';
}
?>
Include-tiedostojen tulisi palauttaa tuloksenaan taulukko, jossa on sivun otsikko ja sisältö.
Kirjoitetaan ensimmäisen tiedoston koodi, joka näyttää yhden sivun sen slug:n perusteella:
<?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;
?>
Ja nyt kirjoitetaan toisen tiedoston koodi, joka näyttää listan linkeistä kaikkiin sivuihin:
<?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' => 'kaikki sivut',
'content' => $content
];
return $page;
?>
Yhden ehdon suorittamisen jälkeen muuttujassa
$page on aina taulukko, joka koostuu yhdestä
rakenteesta. Käytetään tätä taulukkoa
asettamaan otsikko ja sisältö sivuston pohjaan:
<?php
$layout = file_get_contents('layout.php');
$layout = str_replace('{{ title }}', $page['title'], $layout);
$layout = str_replace('{{ content }}', $page['content'], $layout);
echo $layout;
?>
Kootaan kaikki yhteen ja saadaan seuraava koodi:
<?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;
?>
Oletetaan, että sinulla on sivusto käyttäjillä. Tee sivu yhden käyttäjän näyttämiseen, sivu kaikkien käyttäjien listaukseen ja sivu lomakkeella uuden käyttäjän lisäämiseen.