PHPにおけるファイルベースのエンジン

サイトエンジンを実装し、URLに応じて異なるコンテンツが接続されるテンプレートファイルを作成できるようにします。

ページの構造は次のようになっているとします:

layout.php<!DOCTYPE html>
<html>
  <head>
    <title>title</title>
  </head>
  <body>
    <header>
      header
    </header>
    <main>
      content
    </main>
    <header>
      footer
    </header>
  </body>
</html>

コンテンツが挿入される場所に、独自に考案した挿入コマンド、例えば {{ content }} を挿入してみましょう。サイトのテンプレートを変更します:

layout.php<!DOCTYPE html>
<html>
  <head>
    <title>title</title>
  </head>
  <body>
    <header>
      header
    </header>
    <main>
      {{ content }}
    </main>
    <header>
      footer
    </header>
  </body>
</html>

次に、コンテンツファイルを配置する view フォルダを作成します。このフォルダ内、またはサブフォルダ内に配置します。

最初のファイルは次のようになります:

view/page1.php<div>
  content 1
</div>

2番目のファイルは次のようになります:

view/dir/page2.php<div>
  content 2
</div>

3番目のファイルは次のようになります:

view/dir/sub/page3.php<div>
  content 3
</div>

次に、アドレスバーのURLに応じて対応するファイルが読み込まれるようにしましょう。この場合、URL /page1 では1番目のファイル、URL /dir/page2 では2番目のファイル、URL /dir/sub/page3 では3番目のファイルが読み込まれます。

実装に取り掛かりましょう。まず、.htaccess ファイルで、リソースファイル以外のすべてのリクエストアドレスが index.php ページにリダイレクトされるようにします:

.htaccessRewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !\.(js|css|ico|jpg|png|gif)$
RewriteRule .+ index.php

index.php ページで、変数にリクエストされたURLを取得します:

index.php<?php
  $url = $_SERVER['REQUEST_URI'];
?>

次に、テンプレートファイルのテキストを取得します:

index.php<?php
  $layout = file_get_contents('layout.php');
?>

次に、URLに基づいて view フォルダから対応するコンテンツファイルを取得します:

index.php<?php
  $content = file_get_contents('view' . $url . '.php');
?>

テンプレートテキスト内の考案したコマンドを、ファイルから取得したコンテンツに置き換えます:

index.php<?php
  $layout = str_replace('{{ content }}', $content, $layout);
?>

ブラウザに、コンテンツが挿入されたテンプレートファイルを出力します:

index.php<?php
  echo $layout;
?>

すべてをまとめると、次のコードになります:

index.php<?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;
?>
Задание 1

説明されたファイルベースのエンジンを実装してください。