2

私はZendQuickStartガイドに従っていますが、データベースに接続するためのアーキテクチャに少し混乱しています。私は4つの層を見ます:

ModelClass
ModelClass_Mapper
ModelClass_DbTable
Actual MySQL Database

以前は、データベースに直接マップするプロパティを持つ1つのファイルと、フックおよびデータベースアクションイベントのすべてのカスタムコードを保持する拡張クラスがあるアーキテクチャを使用しました。

ModelClassにDbTableを継承させるのではなく、このような3つのファイルが必要な理由の適切な説明はどこにありますか?

4

4 に答える 4

3

ZFクイックスタートは、ZF1.xで適切に機能するように見えるデータマッパーパターンの例を提供します。Zend_Dbを使用するためにデータマッパーを実装する必要はありません。DbTableモデルとZend_Db_Table_Abstractによって提供されるメソッドを使用するだけで、非常に優れた機能を取得できます。

少し説明すると:

Application_Model_Guestbook:単純なドメインモデル(操作するオブジェクト)になります。

Application_Model_GuestbookMapper:データベース列をドメインモデルのプロパティにマップするためのデータマッパーになります。

Application_Model_DbTable_Guestbook:データベースとデータベースアダプタ間の接続を提供するゲートウェイモデルです。ここで、データベーステーブルのオプションと他のテーブルとの関係を指定できます。

データマッパーがアプリケーションにどのように適用されるかを理解する前に、ZFとモデルの経験が少し必要でした。複数のデータベーステーブルに依存するオブジェクトを作成し始めたとき、これらの要素がどのように組み合わされるかを本当に理解し始めました。
'

多くの経験豊富なZF開発者がDoctrineまたは他のORMをすぐに推奨していることに気付くでしょう。おそらくそれが正しい選択です(そして一部の人にとっては反射的であるようです)。少なくともそのORMが行っていることの基本を理解するまで、ORMを使い始めるべきではないと感じています。

[編集]

基本マッパークラスのfetchAll()と同等のメソッドで、Zend_Db_Table_Abstractのインスタンスを__constructorに渡します。

public function findAll($order = NULL) {
        $select = $this->_getGateway()->select();
        if (!is_null($order)) {
            $select->order($order);
        }
        $rowset = $this->_getGateway()->fetchAll($select);
        $entities = array();
        foreach ($rowset as $row) {
            //abstract method required in each table mapper, this instantiates the domain model
            $entity = $this->createEntity($row);
            //identiy map allows lazy loading of certain members
            $this->_setMap($row->id, $entity);
            $entities[] = $entity;
        }
        //returns an array of domain models instead
        return $entities;
    }

テーブル固有のマッパーのcreateEntity()メソッド

public function createEntity($row) {

        $data = array(
            'id'     => $row->id,
            'name'   => $row->name,
            'art'    => $row->art,
            'year'   => $row->year,                
        );

        $entity = new Music_Model_Album($data);
        //set artist id to reference map for lazy loading
        $entity->setReferenceId('artist', $row->artist_id);
        return $entity;
    }

幸運を

于 2012-06-01T10:39:16.413 に答える
2

非常に良い説明がここにあります:http : //martinfowler.com/eaaCatalog/dataMapper.html

短い引用:

データマッパーは、メモリ内のオブジェクトをデータベースから分離するソフトウェアのレイヤーです。その責任は、2つの間でデータを転送し、それらを互いに分離することです。データマッパーを使用すると、インメモリオブジェクトはデータベースが存在することさえ知る必要がありません。SQLインターフェイスコードは必要なく、データベーススキーマの知識も必要ありません。(データベーススキーマは、それを使用するオブジェクトを常に認識しません。)これはマッパー(473)の形式であるため、データマッパー自体はドメインレイヤーにも認識されません。

于 2012-06-01T08:09:40.160 に答える
0

Zend_Db_Tableソリューションは、»TableDataGatewayパターンの実装です。このソリューションには、»RowDataGatewayパターンを実装するクラスも含まれています。

TableDataGatewayRowDataGatewayで誰のパターンを確認できます

于 2012-05-31T22:28:10.077 に答える
0

個人的には、Zend Frameworkは気に入っていますが、データレイヤーライブラリはかなり貧弱だと思います。私が現在使用しているのは、DoctrineとBisnaを組み合わせて2つを統合することです。おそらくあなたもそれらを見てみるべきですか?

于 2012-05-31T21:17:33.110 に答える