PHPにおけるMVCフレームワークの考え方


1083327_15207547


MVCについて

PHPでWebアプリケーションを開発する場合、よくMVCフレームワークが使われます。ではMVCフレームワーク使った場合、M(モデル)、V(ビュー)、C(コントローラー)には具体的にどのような処理を書けばいいのかについて書いてみたいと思います。

Webアプリには必ずデータが存在します。データが無ければ画面に表示するものがないのでアプリとして成立しません。ここでいうデータは具体的には、「データベース上にあるデータ」や「CSV形式・TSV形式のファイル上のデータ」「XML形式のファイル上のデータ」などのことです。

MVCフレームワークはRuby on Railsが発祥のようで、そのRuby on Railsでは、M(モデル)はデータベースのテーブルをそのままオブジェクトとして扱います。テーブルAにはモデルAオブジェクトが対応し、テーブルBにはモデルBオブジェクトが対応するというカンジです。

まず、メインの処理となるビジネスロジックはモデルに書きます。たまにコントローラーに書く方もいますが、基本的にはモデルが担当するべきでしょう。具体的には、モデルにメイン処理のメソッドを実装して、コントローラーではこのモデルのメソッドをコールするような形式が良いかと。そしてモデルのメソッドから得られたデータをビューに渡して表示するといった流れになります。

なんとなく「これはモデルの処理ではないなー」みたいな処理をコントローラーにどんどん書いてしまうとコントローラーが複雑化してくるパターンが多いのでそうならないようにしたいものです。

以下に、いくつか具体的な例をあげてみます。

モデルをテーブル(ファイル)に対応させる方法

Railsにおける「モデル=テーブル」という考え方でMVCを構成します。

テーブルsampleがあったとして、そのモデルクラスSampleを作成します。クラスの名前はテーブル名と同じにするなど一定の規則に従います。同様に他のテーブルについてもモデルクラスを作成して、テーブルと同じ数のモデルクラスを用意します。

モデルクラス[Sample.php]

コントローラーはテーブルに依存せず、処理単位で用意して、その中で各モデルのメソッドを呼び出していくような形になると思います。
コントローラークラス[ProcController.php]

ビューは画面ごとに作成します。可変部分にsmaty変数を使った埋め込み式のHTMLファイルにする方式が一般的だと思います。
ビューテンプレート[sample.tpl]

この方法はテーブル(ファイル)ごとにオブジェクト生成→メソッド呼び出しといった流れになるので非常に整理しやすくなります。ただ、テーブルと関係のない処理をどこに記述するのかといった問題があります。この場合、新たにクラスを用意してそこに記述するか、とりあえずコントローラーに記述することになります。クラスを作ってそこに記述するほうが良いとは思いますが、無駄にクラスが増えてしまう懸念があります。

モデルをコントローラーに対応させる方法

モデルをコントローラーと1対1に対応させる方法もあります。

ProcDataControllerというコントローラーがあった場合、これに対応したProcDataModelというモデルクラスを用意して、処理本体はこのモデルに全て記述するようにします。コントローラーはモデルのメソッドを呼び出すのみにします。
モデルクラス[ProcDataModel.php]

コントローラークラス[ProcDataController.php]

ビューテンプレート[display.tpl]

この方法はコントローラーに対して必ずモデルを用意するので、処理やページごとにモデルを作るイメージになります。複数テーブルにまたがる処理やテーブルに関係のない処理などもモデルに記述すれば良いので、メソッドを記述するべきクラスに迷うことはありません。ただ、同一のテーブルにアクセスしているにもかかわらず、あちこちのモデルに同じような処理が記述されるようなケースが発生することがあります。

まとめ

テーブル単位、コントローラー単位でモデルを作成する例を紹介しました。どちらも一長一短ありますが、一貫した方針でMVCを設計することで、わかりやすいコードになると思います。

シェアして頂けると嬉しいです

















チャーム本店



価格.com ブロードバンド

価格.com 自動車保険









■コメントはお気軽にどうぞ