この重要な概念を理解することで、Web アプリの開発がはるかに簡単になります。

モデル・ビュー・コントローラ(MVC)は、Webアプリケーション開発において非常に人気の高いパターンです。Laravel、Ruby on Rails、CakePHP、CodeIgniter、Laminas(旧Zend)、Yii、Spring、Grailsなど、名だたるアプリケーションフレームワークで採用されています。
ウェブアプリケーション設計の初心者なら、おそらく書籍を手に取って、MVCパラダイム/アーキテクチャに関する学術的な議論の章を苦労して読んだことがあるでしょう。こうした章では、アプリケーション全体のリクエストをトレースするといった分かりやすい説明ではなく、難解な一般論ばかりが述べられていることが多いです。
では、当たり前のことから始めましょう。まずはモデルを除外することから始めましょう。モデルが悪いというわけではありません。むしろ、使うべきです。しかし、アプリケーションのアーキテクチャは実際にはモデルに依存していません。そして、アプリケーションに必要なものが一つだけありますが、これは大文字で表記されていません。ルートです。それでは、これらのアプリが実際にどのように動作するのか、 RCV (ルート・コントローラー・ビュー)を見てみましょう。
この例では、PHP フレームワークである Laravel を使用しますが、他のフレームワーク/言語でも概念は同じです。
まずはリクエストから始めましょう。これは多くの場合、誰かのウェブブラウザですが(APIを呼び出すスクリプトの場合もあります)。例えば、誰かがexample.comで買い物をしているとしましょう。まずwww.example.comにアクセスします。
ブラウザは https://www.example.com にアクセスし、このリクエストはまずNginxやApacheなどのサーバーのウェブサーバーによって処理されます。ウェブサーバーはすべてのリクエストをindex.phpファイルに誘導するように設定されており、このファイルがフレームワークの残りの部分を読み込みます。
フレームワークが最初に行うことは、リクエストをルーター(RCVのR)に渡すことです。Laravelでは、これは作成するroutes/web.phpファイルです。ルーターには次のようなルールがあります。
- 「リクエストがwww.example.comへのGETの場合、リクエストをIndexControllerに渡す」
- 「リクエストがwww.example.com/inventory/<number>に対するGETの場合、その在庫番号とともにリクエストをStoreControllerに渡す」
- 「リクエストがwww.example.com/searchへのPOSTの場合、リクエストをSearchControllerに渡す」
では、コントローラー(RCVのC)とは何でしょうか? コントローラーは、すべてのアプリケーションロジックが実行される場所です。アプリが返されるページを準備するために何らかの処理を実行する必要がある場合、その作業はすべてコントローラーで行われます。
したがって、次の例では、
- www.example.com に対する GET リクエストは単なる静的ページである場合もあれば、在庫状況、現在の特売品、最新のブログ投稿などのデータをデータベースから取得する場合もあります。
- www.example.com/inventory/<number> への GET を処理するために、StoreController はデータベースからその在庫番号に関する情報を取得します。
- www.example.com/search への POST (ユーザーが検索語を入力して Enter キーを押した) を処理するために、SearchController はデータベースを照会して結果を取得します。
各コントローラーは、作成する個別のPHPクラスです。ここでは簡略化して説明しています。通常は、リクエストの種類ごとに異なる関数を持つコントローラーをグループ化し、コードの再利用性を高めるのが一般的ですが、これはあくまで一例です。
例えば、誰かが在庫品目1234に関する情報を要求したとします。Rアウターはそれをストアコントローラに送信し、ストアコントローラはデータベースに問い合わせて、その在庫品目に関するすべての情報を取得します。次のステップは、それを見やすいHTMLに記述してユーザーに返すことです。
ここでビューが登場します。ビューは、CSS、JavaScript、HTMLタグなどすべてとデータ用のプレースホルダーを備えた骨組みです。つまり、ヘッダー、フッター、そしてコンテンツ用のセクションが含まれます。コントローラーは、すべてのデータを入力してビューを「ハイドレート」し、ページをユーザーに送信します。これでRVCラウンドトリップは完了です。
これらのステップのすべてがリクエストごとに必要なわけではありません。静的コンテンツの場合、ルーターは静的ページを直接送信するだけで済む可能性があります。あるいは、コントローラーはデータベースと通信する必要がない場合もあります。しかし、通常、リクエストはルーター-コントローラー-ビューというパスを辿ります。
モデルについてはどうですか?
これらの女神たちは、Web アプリケーションのキャットウォークを美しく飾ることができます。
モデルとは、データベースの行/レコード(MySQLやPostgreSQLなどのSQLデータベース)またはドキュメント(MongoDBなどのNoSQLデータベース)を表すオブジェクトです。SQLを直接記述する代わりに、次のようなことができます。
$item = インベントリ::find(1234); $item->割引 = .15; $item->save();
「UPDATE inventory SET discount = .15 WHERE id = 1234」と書く代わりに。
これはオブジェクト リレーショナル マッピング (ORM) として認識されるかもしれません。
これらは非常に役立ちますが、Webアプリを作成し、コントローラーにSQLディレクトリを記述するだけで済みます。モデルは、コントローラーがデータベースをより簡単に操作できるようにするために存在します。
他にもコンポーネントはあります。ほとんどのウェブフレームワークには、ビューのハイドレーションを容易にするための何らかのテンプレートエンジンが含まれています(例えば、LaravelはBladeを使用しています)。また、セッション管理、認証/認可システム、ログ記録およびデバッグツールなどの便利なコンポーネントも含まれていることが多いです。
基本的な Router->View->Controller というリクエストフローパターンを採用すれば、Web開発初心者でも、どのMVCアプリケーションフレームワークでも問題なく使えるはずです。Laravel の routes.php ファイルの言葉を借りれば、「素晴らしいものを作ろう!」ということです。