参考書やWEBサイトを見てもモデルの部分について詳しく説明してるものが少ないように思います。
MVCにおけるモデルは、データ管理部分を担当し、データベースへやファイルにアクセスする機能を持つとのことですが、具体的にapplication/modelsディレクトリにどういったスクリプトを配置してそれをコントローラ側でどのように処理するのか、その点を詳しく説明しているウェブサイトや参考書があれば教えてください。
この点を理解しないで開発を進めてしまうと、MVCという概念から逸脱して、単にビジネスロジックとデザインだけがわかれただけのウェブアプリになってしまうのではないかと懸念しております。
サイトや書籍じゃなくても即席で解説してくれる方も大歓迎です。
よろしくお願い致します。
初めに、公式ドキュメントでモデルについては以下のページで解説があります。
Create a Model and Database Table
http://framework.zend.com/manual/ja/learning.quickstart.create-m...
簡単に説明すると、以下のような意味合いのファイルを作ることになっています。
models/
Guestbook <- ドメイン(ビジネス)ロジックを持つ。
(コントローラーからはこのクラスだけしか参照しない。)
(Mapperを経由して永続化ストレージへデータを保存する。)
GuestbookMapper <- ドメインロジックから永続化ストレージへの呼び出し用
(永続化ストレージの抽象化用、永続化ストレージはMySQLかもしれないし、NoSQLかもしれない。)
(このファイルを書き換えるだけで、ドメインロジックを変更せずに永続化ストレージを変更できる。)
models/DbTables/
Guestbook <- 永続化ストレージの一種であるデータベースへのアクセス用
(Mapperから参照される。いわゆるDAOです。)
実際はめんどくさすぎてこんな構成にするのには気が滅入るけれど。
あとは、Zend_Formを継承してModelを作るの方法もあるみたい。
個人的には、Zend Frameworkはこうあるべきというがちがちな縛りを嫌う人に向けた仕組みだと考えています。
というわけで、ぼくはMapperも作らずにドメインロジック部分にDbへのアクセスも組み込んでいます。
http://old-journal.sooey.com/2008/03/26/717/
CakePHP を使って説明されています。
「ちゃんとしたMVCではモデルこそが第一級の存在であり、そのように扱われる。コントローラはデータをモデルから取得してビューへと送り出すだけのシンプルな糊として振るまい、アプリケーション内で最も魅力のない部分となる。」
と書かれています。
例を示して簡潔に説明しているので、理解への最初の一歩としてどうでしょう。
ご回答ありがとうございます。
モデルという概念は理解しているつもりですので、実際にZend Frameworkでモデルに何かスクリプトを置いて、それをコントローラで処理している例をみたいです。
CakePHPでもある程度参考になりましたが、Zend Frameworkでの実例を見たいのでもうしばらく質問を公開させていただきたいと思います。
初めに、公式ドキュメントでモデルについては以下のページで解説があります。
Create a Model and Database Table
http://framework.zend.com/manual/ja/learning.quickstart.create-m...
簡単に説明すると、以下のような意味合いのファイルを作ることになっています。
models/
Guestbook <- ドメイン(ビジネス)ロジックを持つ。
(コントローラーからはこのクラスだけしか参照しない。)
(Mapperを経由して永続化ストレージへデータを保存する。)
GuestbookMapper <- ドメインロジックから永続化ストレージへの呼び出し用
(永続化ストレージの抽象化用、永続化ストレージはMySQLかもしれないし、NoSQLかもしれない。)
(このファイルを書き換えるだけで、ドメインロジックを変更せずに永続化ストレージを変更できる。)
models/DbTables/
Guestbook <- 永続化ストレージの一種であるデータベースへのアクセス用
(Mapperから参照される。いわゆるDAOです。)
実際はめんどくさすぎてこんな構成にするのには気が滅入るけれど。
あとは、Zend_Formを継承してModelを作るの方法もあるみたい。
個人的には、Zend Frameworkはこうあるべきというがちがちな縛りを嫌う人に向けた仕組みだと考えています。
というわけで、ぼくはMapperも作らずにドメインロジック部分にDbへのアクセスも組み込んでいます。
ご回答ありがとうございます。
ドメインロジックという単語の意味がよくわかりませんでしたが、道筋や論法という意味だと解釈した上で拝読させていただきました。
非常に参考になりました。
>Mapperも作らずにドメインロジック部分にDbへのアクセスも組み込んでいます。
これは、具体的には models/Guestbook でDAOを利用してデータベース関連の処理を行い、それをコントローラ側から参照しているということでよろしいでしょうか?
また、厚かましいお願いではありますが、コントローラ側から models/Guestbook を参照している一文も例として提示していただければ幸いです。
ドメインロジックは、まぁ、カッコつけてみたが失敗したみたいw
たとえばゲストブックに登録、参照、削除、更新するという
アプリケーション固有の処理を意図しています。
>>Mapperも作らずにドメインロジック部分にDbへのアクセスも組み込んでいます。
>これは、具体的には models/Guestbook でDAOを利用してデータベース関連の処理を行い、
>それをコントローラ側から参照しているということでよろしいでしょうか?
内容はそのとおり。でも、ごめんなさい、ここは書かないほうがよかった。
ちゃんとしたソフトウェアハウスさんでは許されない行為だと思います。
ぼくは社内向けのどうでもいいアプリを作っているので、適当にしています。
モデルの呼び出し方は、以下のモデルを用意して。
models/Guestbook.php
<?php class Application_Model_Guestbook { public function getA() { return 'A'; } }
コントローラーから呼び出します。
controllers/IndexController.php
<?php class IndexController extends Zend_Controller_Action { public function indexAction() { $guestbook= new Application_Model_Guestbook(); $this->view->headTitle($guestbook->getA()); } }
この接頭辞のApplicationはapplication.iniの以下の記述からきています。
appnamespace = "Application"
この話と関わってくる部分として、moduleとかpluginとかあるみたいだけれど、
それらは使ったことがないのでわかりません。
ご回答ありがとうございます。
大満足です。
自分もマッパー作るのは面倒だと思いました。
開発チーム内で認識を共有できればrenmenさんのスタイルで行こうと思います。
ぜひまたご回答よろしくお願い致します。
ご回答ありがとうございます。
ドメインロジックという単語の意味がよくわかりませんでしたが、道筋や論法という意味だと解釈した上で拝読させていただきました。
非常に参考になりました。
>Mapperも作らずにドメインロジック部分にDbへのアクセスも組み込んでいます。
これは、具体的には models/Guestbook でDAOを利用してデータベース関連の処理を行い、それをコントローラ側から参照しているということでよろしいでしょうか?
また、厚かましいお願いではありますが、コントローラ側から models/Guestbook を参照している一文も例として提示していただければ幸いです。