フレームワークと強そうですが、ものすごく単純化して考えると、以下の1行に集約されます。
View(Action($_GET['url']));
これは何をしているかというと?
- どこにアクセスされているかを取得する。 ($_GET[‘url’])
- 必要な処理を施す。 (Action)
- 処理の結果を表示する。 (View)
どこにアクセスされているかを取得する
思い切って、.htaccessに次のように書いてしまいます。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
これは「どんなURLを叩いても全てindex.phpを呼ぶ」というものです。(そこに既にファイルが存在しなければ、ですが)
http://example.com/test
このURLにアクセスすることが次のURLにアクセスするのと同じことになります。
http://example.com/index.php?url=test
こうやって、全部のアクセスをひとつのプログラムで受けてしまう方法をフロントコントローラパターンと呼びます。
とにかく、こうなってしまえばこっちのもので、phpからは$_GET[‘url’]を見るだけで、どのURLにアクセスされたかが分かります。
$_GET['url']
必要な処理を施す
アクセスされたからには、何かしらの処理をしたいです。
function Action($url) {
$title = $url;
$caption = $url . 'のページ';
$text = 'これは' . $url . 'のページです';
return compact('title', 'caption', 'text');
}
あんまり意味はないですが、urlを元に、$titleと$captionと$textという変数にテキトーに値を代入することにしました。
関数は一つしか値を返すことができないので、 compact関数でまとめて返します。( PHPで複数の変数をまとめて連想配列にする関数compact )
もちろん、このAction関数の実行はアクセスされたURLを元にします。
Action($_GET['url']);
処理の結果を表示する
Webページですから、何かしらの結果を表示したいです。
例えば、index.phpとは別に、次のようなlayout.phpというテンプレートファイルを作成しておきます。
// layout.php
これは、$titleと$captionと$textと然るべき場所に表示されるというだけのテンプレートです。
このテンプレートの使い方はとても簡単です。
function View($params) {
extract($params);
include ('./layout.php');
}
さきほどAction関数内で連想配列にまとめたものを今度はextractで展開します。( PHPで連想配列を複数の変数に展開する関数extract )その後、includeでテンプレートを読み込むだけです。
ActionとViewという関数を定義した上で、最終的には、index.phpでは、次の1行を実行するだけです。
View(Action($_GET['url']));
動作確認
http://example.com/test
などにアクセスしてみます。(example.comの部分はもちろんご自身のドメインに置き換えてください。)
確かに、次のような処理が行えているのが分かります。
- URLの http://example.com/test のtestをindex.phpで受ける
- $title, $caption, $textの文字列を生成する
- テンプレートに従って表示する
Webアプリケーションのフレームワークは、だいたいこんな流れを元にしているのが多いようです。
コメント