MVC(Model-View-Controller)を理解する

CakePHPは MVC デザインパターンを採用しています。MVCを利用したプログラミングはアプリケーションを3つの主要なパーツに分解します:

モデル(Model)層

モデル層はビジネスロジックを実装するアプリケーションの部品を表します。これはデータの検索、アプリケーションに意味のある形への変換、また処理、検証(validating)、関連(associating)、そしてデータを扱うことに関する様々なタスクに責任をもつことを意味します。

一見して、モデルオブジェクトはアプリケーションに使用しているであろうデータベースとやりとりする最初の層と見ることができるでしょう。 しかし、一般的にこれはアプリケーションを実装するものの主要な概念を表します。

ソーシャルネットワークのケースでは、モデル層はユーザのデータを保存する、友人の繋がりを保存する、ユーザの写真を保存または検索する、新しい友人の提案を検索する、等々のタスクを引き受けることでしょう。 このとき、モデルオブジェクトは「友達(Friend)」、「ユーザ(User)」、「コメント(Comment)」、「写真(Photo)」と考えることができます。

ビュー(View)層

ビューはモデリングされたデータの表現を描写します。利用する情報の取得に責任を持つモデルオブジェクトから分離されて、ビューはアプリケーションが必要とする表現に関するインターフェイスの生成を担当します。

例として、モデル層はデータのセットを返し、ビューはそれを含んだHTMLページ、もしくは、その他の用途の為にXMLで整形された結果を描画します。

ビュー層はデータのHTMLやテキストの表現のみに制限されているわけではありません。 動画、音楽、ドキュメント、あなたが考えうるその他のフォーマットなど、必要に応じた幅広いフォーマットを供給するために利用することができます。

コントローラ(Controller)層

コントローラ層はユーザからのリクエストを扱います。 これはモデル層とビュー層の助けを借りてレスポンスをレンダリングして返す責任を負います。

コントローラは、タスクを終える為の全ての必要とされるリソースが正しい労働者に委譲されることに注意を払うマネージャーと見ることができます。 クライアントからの要求を待ち、認証と承認のルールによる検証を行い、データの取得または処理をモデルに委譲し、クライアントが受け入れる適切な表示上のデータの種類を採択し、最終的にその描画処理をビュー層に委譲します。

CakePHPのリクエスト循環

Figure 1

図1: CakePHPでの基本的なMVCリクエスト

典型的なCakePHPのリクエスト循環はユーザがアプリケーション内でページまたはリソースにリクエストを投げるところから始まります。 このリクエストはまずディスパッチャー(dispatcher)により処理され、これはリクエストを処理するために適切なコントローラオブジェクトを選択します。

コントローラにリクエストが到着すると、モデル層と通信し必要とされるデータの取得または保存操作が実行されます。 この通信が終わると、続けてコントローラはモデルから提供されたデータの基づく結果の出力を生成するタスクを適切なビューオブジェクトに委譲します。

最後に、この出力が生成されると、すぐにユーザに対して描画が行われます。

アプリケーションへのほとんどのリクエストはこの基本的なパターンを踏襲します。 後にCakePHPに特有なものの詳細を追加しますので、これを覚えておいてください。

利益

どうしてMVCを利用するのでしょうか。それは確かに信用できるソフトウェア・デザインパターンで、アプリケーションに保守性、モジュール性を与え、アプリケーションを高速に開発されたパッケージへと変貌させます。 アプリケーションの仕事を分割されたモデル、ビュー、コントローラに組み立てることは、アプリケーションの足取りを非常に軽くします。 新しい機能は簡単に追加でき、古い機能の改訂は一捻りです。 また、モジュール化され分割された設計は開発者とデザイナーが同時に作業することを可能にします。 これは迅速に プロトタイピング を行えるということでもあります。 また分割は、開発者が他に影響することなくアプリケーションの一部に変更を加えることを可能にします。

もしあなたがこの方法でアプリケーションを構築したことが無いなら、慣れるためにある程度の時間を必要とします。 しかし一度でもCakePHPを利用したアプリケーションを構築したなら、あなたは他の方法でやりたいと思わないであろうことを私たちは確信しています。

最初のCakePHPアプリケーションを開始するには、 今すぐブログチュートリアルを試しましょう。