PHPエンジンでのシンプルなルーティング
前回のレッスンでは、当サイトには 単一のURLグループしかありませんでした。 もちろん、通常ウェブサイトには 複数の種類のアドレスがあります。
各アドレスグループは、 それぞれの正規表現によって処理されます。 これらはルートと呼ばれます。 したがって、ルートとそれを処理するコードを 対応付けるプロセスをルーティングと呼びます。
例えば、2種類のアドレスがあるとしましょう。 各グループに対して独自のルートを書いてみましょう:
<?php
if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
// スラグによる単一ページ
}
if (preg_match('#^/page/all$#', $url, $params)) {
// 全ページのリスト
}
?>
便宜上、各ルートの処理コードを 別々のファイルに分けましょう:
<?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';
}
?>
インクルードされるファイルは、結果として ページのタイトルとコンテンツを含む配列を 返す必要があります。
まず、そのスラグに基づいて単一ページを 表示する最初のファイルのコードを書きましょう:
<?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;
?>
次に、全ページへのリンクリストを 表示する2番目のファイルのコードを書きましょう:
<?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には常に単一の構造を持つ配列が
格納されます。この配列を使って、
サイトテンプレートにタイトルとコンテンツを
挿入しましょう:
<?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;
?>
ユーザーがいるサイトがあるとします。 単一ユーザーを表示するページ、 全ユーザーを表示するページ、 および新しいユーザーを追加するための フォームページを作成してください。