somemo's diary

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【php】レイアウト読み込み処理の切り出し

前回、レイアウトの共通部分を別ファイルに切り出しました。ただし、可変部分を変数に格納し、その変数を使用する別ファイルを読みこむ処理を記述する必要があります。

リクエストの処理

上記を改善するとなると、可変部分を記述したファイルを別の場所で読みこむ必要があります。つまり、リクエストを別の場所で処理し、リクエストに応じて読みこむ可変部分を決定する処理が必要です。ルーティングですね。

フロントコントローラー

ルーティングのために、リクエストを別の場所で処理するための方法です。最初の処理を特定のファイルに一任させます。

よく利用される方法は、apachemod_rewriteによる方法です。localhost/lobbyのようなリクエストでも、特定のファイル(例:index.php)で処理されることができます。このような方法を利用できない場合でも、localhost/index.php/lobbyとすることで対応できます。

ルーティング

index.phpを以下のように修正しました。

<?php
// リクエストURIの取得
$request_uri = rtrim($_SERVER['REQUEST_URI'], '/');

// ルーティングの設定を取得
$route = array(
    '/chat/lobby' => 'lobby.php'
);

// URIと設定をマッチングさせる
// ルーティングに対応するファイルを読み込む
if (isset($route[$request_uri])) {
    ob_start();
    require '../views/' . $route[$request_uri];
    $_content = ob_get_clean();

    include '../views/layout.php';

} else {
    echo 'not found';
}

URIとルーティングの設定をマッチングさせています。存在しなければ、not foundと表示されるだけです。存在している場合、対応するファイルを読み込んでいます。もともと読み込むファイルに記述されていた共通レイアウトの読み込みや、可変部分を変数に格納する処理も移動しました。これによって、切り出しもできました。

今後

フロントコントローラーであるindex.phpにルーティング処理や、ページの表示処理が含まれています。また読み込むファイルはページ処理と制御処理が入り混じってます。いまだにクラスもありません。これらをクラスを使って役割を分離するようにしていきたいと思います。