(完全に独り言)
ブラウザーにページを出力する場合、ひとつのアプリケーションの内容だけ、ということはいまやほとんどない。
WordPressで画面を作っても右ペインにはアーカイブや更新記事のリスト、ウィジェットなどが出てくる。
同様のものを自分で作ろうと考えると、これは非常にむつかしい。
1. HTMLなどクライアントサイドでカバーする
もともとHTMLは「ひとつの文書がひとつの画面」である。
たとえjavascriptでドキュメントを読んだとしてもappendchildと現在の文書に追加することになる。
例外はiframeだが、例外なだけにあまりアプリケーションで使うべきではないだろう。
2. サーバーサイドでカバーする
Code Igniterはモデルもビューも複数を呼ぶことは許しているが、コントローラーを複数呼ぶことはできないように作ってある。
複数コントローラーがシステム内にあって、別コントローラーを呼び出す方法はただひとつ、redirect しかない。
おそらくHTMLと整合性を考えたのだろうと思われる。
しかし、冒頭に書いたように違う話は違うファイルで考えたいのが開発者というものだ。
例えば、WordPressならば「記事を表示する」「フッター」「ヘッダー」「アーカイブ」とそれぞれコントローラーを作ったほうが、考えやすい。
じゃぁ、HMVC(階層型MVCモデル)という考えを取るとどうなるか。
Code IgniterをエンハンスしてHMVCを創りだしているパッケージはいくつかあった。
しかし、致命的なのは(当たり前だが)ページが遷移した時にそれぞれが保持するデータは自分で管理しなくてはならないということだ。言い換えるとセッションにしろGET/POSTデータにしろ自分で管理。それぞれのコントローラーで似たようなコードを書くことになる。
CodeIgniterで現実的な書き方は以外に臭い次のようになるのではないだろうか。
<?php class Director extends CI_Controller{ public function index(){ require('sub1'); require('sub2'); } }
それでsub1, sub2の中を関数とする、と。
バカみたいだが、少なくともファイルを分けて開発はできる。
ひとつのファイルに何百行もコードを書くのはイヤだという人向けですかね。