PHPにおけるファイルベースのエンジン
サイトエンジンを実装し、URLに応じて異なるコンテンツが接続されるテンプレートファイルを作成できるようにします。
ページの構造は次のようになっているとします:
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
<header>
header
</header>
<main>
content
</main>
<header>
footer
</header>
</body>
</html>
コンテンツが挿入される場所に、独自に考案した挿入コマンド、例えば {{ content }} を挿入してみましょう。サイトのテンプレートを変更します:
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
<header>
header
</header>
<main>
{{ content }}
</main>
<header>
footer
</header>
</body>
</html>
次に、コンテンツファイルを配置する view フォルダを作成します。このフォルダ内、またはサブフォルダ内に配置します。
最初のファイルは次のようになります:
<div>
content 1
</div>
2番目のファイルは次のようになります:
<div>
content 2
</div>
3番目のファイルは次のようになります:
<div>
content 3
</div>
次に、アドレスバーのURLに応じて対応するファイルが読み込まれるようにしましょう。この場合、URL /page1 では1番目のファイル、URL /dir/page2 では2番目のファイル、URL /dir/sub/page3 では3番目のファイルが読み込まれます。
実装に取り掛かりましょう。まず、.htaccess ファイルで、リソースファイル以外のすべてのリクエストアドレスが index.php ページにリダイレクトされるようにします:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !\.(js|css|ico|jpg|png|gif)$
RewriteRule .+ index.php
index.php ページで、変数にリクエストされたURLを取得します:
<?php
$url = $_SERVER['REQUEST_URI'];
?>
次に、テンプレートファイルのテキストを取得します:
<?php
$layout = file_get_contents('layout.php');
?>
次に、URLに基づいて view フォルダから対応するコンテンツファイルを取得します:
<?php
$content = file_get_contents('view' . $url . '.php');
?>
テンプレートテキスト内の考案したコマンドを、ファイルから取得したコンテンツに置き換えます:
<?php
$layout = str_replace('{{ content }}', $content, $layout);
?>
ブラウザに、コンテンツが挿入されたテンプレートファイルを出力します:
<?php
echo $layout;
?>
すべてをまとめると、次のコードになります:
<?php
$url = $_SERVER['REQUEST_URI'];
$layout = file_get_contents('layout.php');
$content = file_get_contents('view' . $url . '.php');
$layout = str_replace('{{ content }}', $content, $layout);
echo $layout;
?>
説明されたファイルベースのエンジンを実装してください。