Web アプリケーションで MVC を考える - リクエストの取り扱い

 View の入力を最初に受け取るのは Controller だ。

 となれば、

「Web アプリケーションにおいて、HTTP リクエスト(以降、リクエスト)は Controller が取り扱う」

 が仮定される。

 これは正しいかを検討してみる。

 リクエストはヘッダとボディで構成されている。ただし Web アプリケーションでは、ヘッダはWeb サーバ(以降 サーバ)ないしフレームワーク(以降 F/W) で処理を済ませてしまうことが多いため、今回は考えない。

 残るボディ。Web アプリケーション、CGI の伝統からボディは「キー=値」の組み合わせであるとする。この値の組み合わせによって「リクエストが期待する動作が決定する」、つまり「リクエストに対するHTTP レスポンス(以降、レスポンス)が決定する」とする。

 最終的にレスポンスを作るのは View の仕事だ。全体を通じて見るとレスポンスはリクエストに依存するが、仮定によりリクエストは Controller が取り扱うため、View はリクエストを考慮しない。View にとってリクエストとレスポンスは切り離されていて、依存しない。では View は何を以ってレスポンスを作るべきか。

 MVC ではModel がデータを取り扱う。データには外部から与えられるものと内部に蓄積されているもの(内部データ)の2つが存在する。この外部から与えられるもの(以降、外部データ)が、Web アプリケーションにとってはリクエストに当たる。前述のとおりヘッダは意識しないため、ボディの「キー=値」の組み合わせとなる。

 仮定により View と同様、Model はリクエストを意識しない。つまり外部データは Controller が Model に渡すことになる。Model は Controller から受け取った外部データと内部データを複合的に取り扱うことになる。

 全体を通じて見るとレスポンスはリクエストに依存するため、レスポンスは Model の結果を元に作成されることになる。

 さてView は何を以ってレスポンスを作るべきか。つまり Model の結果を元にレスポンスを作成することになる。MVC では Model から View に直接接続することがないため、Controller が Model の結果を受け取って、View に引き渡すことになる。

 全体の流れを見ると、Controller はリクエストを外部データとして Model に渡し、その結果を View に渡すという構造になる。

 ちぐはぐになってしまった。

 Controller は View の結果を受け取らないし、F/W が Controller の結果を受け取れない。

 つまり仮定の

「Web アプリケーションにおいて、HTTP リクエスト(以降、リクエスト)は Controller が取り扱う」

 は正しくないということになる。

 ではリクエストを取り扱うべきは Controller ではないのか。

 ちぐはぐさを無くすために、下記の図を考えてみる。

 この図から導き出されることは、

「Controller はリクエストから Model と View を選択する」

 ということ。

 Controller はあくまでリクエストを元に Model を選択しているだけだが、リクエストを取り扱っている。そして Model もリクエストを取り扱っている。

 つまり局所的に管理するのではなく、

「リクエストは Controller と Model で取り扱われる」

 ということになる。

 さて、これは正しいのか。