今日は「フロントコントローラーとは?MVCとは?フレームワークの最小構成とは?」を教わり、目からうろこがポロポロ落ちました。
on 2011-03-07 23:56:02
webから
喫茶店を遊牧しながら勉強したり開発したりする大学院生のブログです。
フレームワークの本当の骨の部分だけを学ぼうという企画。
WEBで良く利用される構成が、フロントコントローラーと呼ばれる構成だそう。
これは、「全てのアクセス」を「たったひとつのindex.php」で受けとって、全てそこで処理しようというもの。
どんなURLにアクセスしてもindex.phpが実行されるので、構成が楽。
まずは「いかにして全てのアクセスをindex.phpにまとめるか」というのが問題ですが、これは.htaccessの設定で可能です。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
こんなファイルをテキストエディタで作成し、.htaccessと名付け、WEBのルートディレクトリに置きます。
すると全てのアクセスがindex.phpに集約されます。
.htaccessで全てのアクセスをindex.phpにリダイレクトするわけですが、その挙動はシンプル。
http://choilog.com/blog/show/123
たとえば、このようなアクセスがあったとしましょう。
これは次のURLにリダイレクトされます。
http://choilog.com/index.php?url=blog/show/123
したがって、index.phpの中で$_GET['url']を調べれば、どんなURLにアクセスされたかが分かります。
全てのアクセスがindex.phpというコントローラーに渡りましたので、あとは、コントローラーが適切なモデルとビューを呼び出すだけです。
たとえば、このようなindex.phpを書きます。
$_GET['url']には、'blog/show/123'のような値が入っていますので、これをexplode関数でスラッシュ区切りにします。
その後、1番目の要素であるblogをモデル名と考えます。
$params = explode('/', $_GET['url']);
$model = array_shift($params);
そのモデル名のファイルをインクルードします。
ここでは'./models/blog.php'がインクルードされます。
その中に定義されている、handleという関数を呼び出すことで実際の処理を行うものとします。(handle関数は、このあと定義します。)
include ('./models/'.$model.'.php');
$ret = handle($params);
handle関数の結果得られた$retをextract関数で展開します。
その後、ビューファイルをインクルードして実際の表示を行います。(ビューの書き方もあとで説明します。)
extract($ret);
include ('./views/'.$model.'.php');
こまかい値の検証などを除けば、6行くらいでフロントコントローラーが完成です。
モデルの書き方は?
今回は、handle関数を定義すれば、それで終わりでした。
$paramsに値が渡されていますが、無視して'Hello World!'の文字列を含む配列を返します。
function handle($params){
return array('str'=>'Hello World!');
}
最後にこれらを表示するビューを作ります。
これは、ほとんどただのHTMLファイルです。
途中で$strという変数を表示させています。これが、先ほどモデルから返された'Hello World!'そのものです。
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>シンプルフレームワーク</title>
</head>
<body>
<h1><?php echo $str; ?></h1>
</body>
</html>
これだけです。
4つのファイルに数行ずつのコードを書くだけで、超シンプルなMVCフレームワークができます。
「データベースアクセスはどうするの?」とか色々疑問は湧きますが、少しずつ足していけばどうにでもなります。
CakePHPやRuby on Railsなどの既存のフレームワークに最初から頼るのも良いですが、どういう仕組みで動いているのかを考え見ると、案外楽しいかもしれませんよ!
php
フレームワーク
mvc
フロントコントローラ
シンプル
htaccess
フロントコントローラー
最小
index.php
作る