CodeIgniterのMVCについてのメモ
最近CodeIgniterを触ってて、いろいろ悩むこととかあったので書いておきます。
特にMVC周りでは今もどうしていいかわかりません…
CodeIgniterに関しては公式が、MVCに対してルーズなアプローチをとっていると宣言しているので、MVCでちゃんと書くにあたりネット上でもいろいろな意見がある感じです。
ルーズでもいいけど、MVCに基いて設計する場合の解を示してくれたら、よかったんですがね。公式からしたら「勝手にしろよ」って感じなんでしょうが(^_^;)
実際問題、素人の僕がいろいろ悩めるくらいにルーズなので、CodeIgniter使ってチーム開発する場合には、ちゃんとルールを決める必要があると感じました。
そこで、どうしたらいいかを自分なりに考えたので残しておきます。
CodeIgniterであろうとなかろうと、MVCの流れは以下のようになると思います。
MVCの流れ(コントローラ目線)
1.ビューからの入力を受けて
2.対応するモデルに投げて、データもらって
3.データを対応するビューに渡して出力
この流れに準拠してもいろいろな問題が生じます。
CodeIgniterではモデル・ビュー・コントローラの部分をapplicationディレクトリ配下のmodels・views・controllersディレクトリにそれぞれ分けることができます。
「なんだわかりやすいじゃん!」って思っていたのですが、それぞれの境界線があいまいだし情報いろいろあって混乱してます。実際に使ってみて主に以下のような問題にぶつかりました。
・バリデーションはどこで実行するの?コントローラ?モデル?
・ロジックはどこに書くの?
・コントローラが肥大化する
最初のバリデーションに関する問題が発生する理由は、CodeIgniterがバリデーションの実行をユーザに委ねているからです。フォームからの入力値は入力クラスに勝手に入ってるんだけど(じゃあバリデーションもやってくれよ)、実行するときはアプリケーションでform_validation->run()をしないとダメ。
これについてはいろいろ悩んだんですが、結果的にどっちでもいいかなと思いました。もちろん開発する際にはコントローラに書くかモデルに書くかはしっかり決めるべきだと思います。個人的に不正な値はコントローラで叩いてしまうのが好みです。どちらにしてもバリデーションルールの設定は、ちゃんと設定ファイル(form_validation.php)にまとめてコードをすっきりさせた方がいいですね。
次のロジックの場所についてですが、これについては答えが出せてません。CodeIgniterのユーザガイドでは、モデルはデータベースとアクセスするもの(DAOと名乗れ!)と書かれていて、ロジックは知らねーよ状態です。じゃあコントローラに…となるのですが、大きなシステムでロジックをコントローラに書いてしまうと処理を追うのが大変になってしまいます。つまり、ロジックは迷子です。
そこで、ロジックの場所を考えてみたところ2つ浮かびました。1つはモデルにデータアクセスとロジックを分けてわかりやすいように書く。もう1つはロジックをユーザライブラリに書く。これもまたどっちでもいいけど、ちゃんと決めて守ることが大事だと思います。
最後のコントローラの肥大化についてですが、これは最初の2つにかなり関連しています。肥大化が問題なのではなくて、肥大化することにより処理の大枠が掴めなくなることが問題だと僕は考えています。つまり、「このURLを叩いたら、こうしてこうする!!」というのがわかる部分がないのが、個人的に辛いです。ロジックを上手く分離できたらなんとかなるのかなー、と甘い考えをもっています。結局チーム内でルール決めて、それに準拠するのが一番ですね。CodeIgniterのようなゆるいフレームワークを使う場合は、チーム内でのルールがかなり重要になってくると思います。
長々と書きましたが、今後はFuelPHPを使っていくことになりそうなので(え?)、CodeIgniterでぶつかった問題を意識して使っていければいいと思います。
ちらっと見た感じでは、FuelPHPにはアクションメソッド(ブラウザから実行されるメソッド)とかビューモデル(なんだかよくわからない)とかあって良さそう。