かってぃのブログ

喫茶店を遊牧しながら勉強したり開発したりする大学院生のブログです。

katty0324

今日は「フロントコントローラーとは?MVCとは?フレームワークの最小構成とは?」を教わり、目からうろこがポロポロ落ちました。

on 2011-03-07 23:56:02

webから

PHPで超シンプルなフレームワークを作る。

フレームワークの本当の骨の部分だけを学ぼうという企画。

フロントコントローラー

WEBで良く利用される構成が、フロントコントローラーと呼ばれる構成だそう。

これは、「全てのアクセス」を「たったひとつのindex.php」で受けとって、全てそこで処理しようというもの。

どんなURLにアクセスしてもindex.phpが実行されるので、構成が楽。

.htaccessの設定

まずは「いかにして全てのアクセスを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

たとえば、このような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行くらいでフロントコントローラーが完成です。

./models/blog.php

モデルの書き方は?

今回は、handle関数を定義すれば、それで終わりでした。

$paramsに値が渡されていますが、無視して'Hello World!'の文字列を含む配列を返します。

function handle($params){
    return array('str'=>'Hello World!');
}

./views/blog.php

最後にこれらを表示するビューを作ります。

これは、ほとんどただの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などの既存のフレームワークに最初から頼るのも良いですが、どういう仕組みで動いているのかを考え見ると、案外楽しいかもしれませんよ!


1人が「いいね!」と言っています!

php フレームワーク mvc フロントコントローラ シンプル htaccess フロントコントローラー 最小 index.php 作る