MVCフレームワーク

MVCの概念

MVCの概念

PHPのプログラミング手法としてMVCと呼ばれるものがあります。
MVCとはModel・View・Controllerの略で、処理を3つの役割に分割して実装する手法です。

Modelは処理のメインロジックを担当します。
Viewは処理結果として画面表示(HTML出力)を担当します。
そしてControllerはクライアントよりのリクエストを直接受け取って処理を行う、一番前面となる部分です。

イメージとしてはControllerはリクエスト情報を基にModelに処理を依頼し、
Modelはデータと連携して処理を行い、処理結果をControllerに返し、
Controllerは返ってきた処理結果データをViewに渡し、
Viewはデータを基にHTML出力処理を行う。
という感じになります。
Controllerが最も前面かつ全ての仲介に位置することになります。

PHPも、フレームワークがたくさん出回ってきました。
有力なところで、ZendFramework、CakePHP、Simfonyなどがあります。
これらは全て、便利なライブラリ集であると同時にMVCモデルを取り入れたリクエスト処理が可能な、MVCモデルのフレームワークでもあります。

これらを利用すれば手軽にMVCモデル実装が可能ですが、
このコーナーでは敢えてMVCモデルの仕組みを1から作ってみます。
そうすることで、MVCとはどんな仕組みで動いているのかを理解する事が出来ると思います。

オブジェクト指向としてのMVC

通常、PHPでオブジェクト指向実装を行うといっても、
実際はURLで指定されたPHPファイル(以降フロントと呼びます)に処理が入ります。
例えばhttp://www.aiueo.com/aaa.phpというURLでリクエストがあった場合、
Webサーバーではドキュメントルート直下のaaa.phpというファイルに処理が入ります。
aaa.phpではクラスファイルの読込を行い、そのクラスのメソッドを使用して処理結果データを生成し、そのデータを基にHTMLを生成してレスポンスとなるHTMLに埋め込むという形を取ります。

当然機能ごとに使用するクラスが異なるので、
各フロントごとに必要なクラスの呼び出しを行う必要があります。

つまり、フロントとなるphpはクラス化することはできず、
また機能ごとにフロントが必要となります。
このへんがPHPをオブジェクト指向化する上で中途半端な感じがする一つの要因でもあると思います。

PHPにおけるMVCはPHPのオブジェクト指向実装としては究極であると言えます。
処理を役割分担して、役割ごとにクラスを作る。そしてフロントPHPを意識することなくクラス実装を行う事が出来ます。

MとVとCそれぞれの役割

モデル(M)・ビュー(V)・コントローラー(C)。
具体的にそれぞれの役割をどのように考えればよいか。

まずコントローラー。
コントローラーのクラス構造はURLに直結するものです。
コントローラークラスとそのメソッドの組み合わせでURLが形成されると考えてください。
そしてリクエスト情報を直接処理するのがコントローラーです。

次にモデルです。
クラス設計の世界ではアプリケーションに関わるオブジェクトをクラスとしてプログラミングに起こすことをモデリングと呼んだりします。
つまりモデルとはアプリケーションに登場する事象を具現化したものです。
・・というと抽象的な表現になりますが、
アプリのメインロジックを書くのがモデルと、とりあえずは思ってください。

最後にビューです。
その名の通りWEBアプリにおけるインターフェイス部分に関わる処理を行うのがビューです。
つまりHTML生成を担う部分です。
モデルやコントローラーには決してHTML生成ロジックは書かないで、
これらによって作り出されたデータをもとにHTML生成を行います。

前述のとおり、コントローラーがモデルとビューを制御します。
コントローラーは絶対に必要です。MVCの中ではURLと直結した処理の基点と言えるからです。
逆に言うとコントローラーに全てのロジックを詰め込んで、コントローラーだけでも動かせるのです。
でもそれは好ましくないと言うか、MVCの意味がありません。
MとVとCの切り離し方がポイントともいえます。