Zend Frameworkについてお聞きします。


参考書やWEBサイトを見てもモデルの部分について詳しく説明してるものが少ないように思います。

MVCにおけるモデルは、データ管理部分を担当し、データベースへやファイルにアクセスする機能を持つとのことですが、具体的にapplication/modelsディレクトリにどういったスクリプトを配置してそれをコントローラ側でどのように処理するのか、その点を詳しく説明しているウェブサイトや参考書があれば教えてください。

この点を理解しないで開発を進めてしまうと、MVCという概念から逸脱して、単にビジネスロジックとデザインだけがわかれただけのウェブアプリになってしまうのではないかと懸念しております。

サイトや書籍じゃなくても即席で解説してくれる方も大歓迎です。

よろしくお願い致します。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/02/01 19:32:19
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:renmen No.4

回答回数2ベストアンサー獲得回数1

ポイント40pt

初めに、公式ドキュメントでモデルについては以下のページで解説があります。

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へのアクセスも組み込んでいます。

id:hardboiled243

ご回答ありがとうございます。

ドメインロジックという単語の意味がよくわかりませんでしたが、道筋や論法という意味だと解釈した上で拝読させていただきました。

非常に参考になりました。

>Mapperも作らずにドメインロジック部分にDbへのアクセスも組み込んでいます。

これは、具体的には models/Guestbook でDAOを利用してデータベース関連の処理を行い、それをコントローラ側から参照しているということでよろしいでしょうか?

また、厚かましいお願いではありますが、コントローラ側から models/Guestbook を参照している一文も例として提示していただければ幸いです。

2011/02/01 13:06:39

その他の回答4件)

id:mzkmzk No.1

回答回数50ベストアンサー獲得回数2

あのぅ、いきなりですいませんがこういうむずかしい質問だと回答していただける人が  いないのではないでしょうか。{こんな回答になってしまいスイマセンでした。

id:mzkmzk No.2

回答回数50ベストアンサー獲得回数2

変な回答だったのでポイントは結構です。

id:ktoshi No.3

回答回数107ベストアンサー獲得回数6

ポイント20pt

http://old-journal.sooey.com/2008/03/26/717/

CakePHP を使って説明されています。

「ちゃんとしたMVCではモデルこそが第一級の存在であり、そのように扱われる。コントローラはデータをモデルから取得してビューへと送り出すだけのシンプルな糊として振るまい、アプリケーション内で最も魅力のない部分となる。」

と書かれています。

例を示して簡潔に説明しているので、理解への最初の一歩としてどうでしょう。

id:hardboiled243

ご回答ありがとうございます。

モデルという概念は理解しているつもりですので、実際にZend Frameworkでモデルに何かスクリプトを置いて、それをコントローラで処理している例をみたいです。

CakePHPでもある程度参考になりましたが、Zend Frameworkでの実例を見たいのでもうしばらく質問を公開させていただきたいと思います。

2011/01/26 20:05:58
id:renmen No.4

回答回数2ベストアンサー獲得回数1ここでベストアンサー

ポイント40pt

初めに、公式ドキュメントでモデルについては以下のページで解説があります。

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へのアクセスも組み込んでいます。

id:hardboiled243

ご回答ありがとうございます。

ドメインロジックという単語の意味がよくわかりませんでしたが、道筋や論法という意味だと解釈した上で拝読させていただきました。

非常に参考になりました。

>Mapperも作らずにドメインロジック部分にDbへのアクセスも組み込んでいます。

これは、具体的には models/Guestbook でDAOを利用してデータベース関連の処理を行い、それをコントローラ側から参照しているということでよろしいでしょうか?

また、厚かましいお願いではありますが、コントローラ側から models/Guestbook を参照している一文も例として提示していただければ幸いです。

2011/02/01 13:06:39
id:renmen No.5

回答回数2ベストアンサー獲得回数1

ポイント40pt

ドメインロジックは、まぁ、カッコつけてみたが失敗したみたい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とかあるみたいだけれど、

それらは使ったことがないのでわかりません。

id:hardboiled243

ご回答ありがとうございます。

大満足です。

自分もマッパー作るのは面倒だと思いました。

開発チーム内で認識を共有できればrenmenさんのスタイルで行こうと思います。

ぜひまたご回答よろしくお願い致します。

2011/02/01 19:30:06

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません