0

ドメイン モデルとデータ マッパーが OOP スノブの選択であることは知っています (Martin Fowler が自称するように、補完的な方法で「スノブ」を使用します) - ただし、ファウラーでさえPOEAA で次のように述べています

「Active Record は、複雑すぎないドメイン ロジックに適しています...」

製品と請求書のドメイン モデルが単純で、モデル化するテーブル/オブジェクト/概念が多すぎず、関係もそれほど複雑ではありません。では、これは Active Record の適切な使用例でしょうか?

Fowler はまた、アクティブ レコードは行データ ゲートウェイに似ていると述べていますが、アクティブ レコードにはドメイン ロジックがあるという違いがあります。

これが Active Record の有効な使用例であり、Zend が Row Data Gateway を提供しているため、(単純にテーブル名を追加するのではなく) これらのオブジェクトをインテリジェントに拡張するソリューションは、Zend Framework を使用して Active Record オブジェクトを作成する良い方法のように思えます。 . 実際、その概念はこの SO answer で説明されていますこれは、Zend Framework 内に Active Record を実装する方法として受け入れられますか?

もちろん、その質問に対する最も一般的な回答はBill Karwin (Zend の Db 実装に取り​​組んだ)によるもので、 orを使用しないことを推奨しています (少なくとも私はそう読みました)。Zend_Db_TableZend_Db_Row

問題のドメイン モデルがより複雑になった場合、Data Mapper ソリューションに移行したいという希望を完全に受け入れます。私はさまざまな ORM/DataMappers を見てきました (問題のドメイン モデルだけでなく、最近 OOP 設計パターンについて詳しく読んでいます) が、いくつかの点では多すぎるように思えます。

4

2 に答える 2

3

私はこれを行い、結果に完全に満足しています。

IMO、決してしてはいけ ない唯一のことは、コントローラーとビュー/ビューヘルパーで親メソッドを使用することです。つまり、アプリケーションの残りの部分で使用される拡張 Zend_Db_Table_Abstract および Zend_Db_Table_Abstract_Row クラスに独自のメソッドを常に記述します。これにより、必要に応じて TDG/AR をより複雑なものに交換するオプションが残ります。

于 2010-05-12T18:52:34.330 に答える
2

単純なものについては、Zend_Db_Table パッケージを拡張する yes モデルが適切な選択です。私はそれを何度も使用して大成功を収めましたが、次のようになります。

class App_Model_Users extends Mojito_Model_Abstract
{    
    protected $_dbTableClass='App_Model_Users_Table';

    public function getByEmail($email)
    {
        $Select=$this->_DbTable->select()->where(new Zend_Db_Expr('LOWER(usrEmail)=?'),strtolower($email));
        $User=$this->_DbTable->fetchRow($Select);
        return $this->verifyRow($User);
    }

}

class App_Model_Users_Table extends Zend_Db_Table_Abstract
{
    protected $_name = 'users';
    protected $_primary = 'user_id';
    protected $_rowsetClass = 'App_Model_Users_Rowset';
    protected $_rowClass = 'App_Model_Users_Row';
}

class App_Model_Users_Rowset extends Zend_Db_Table_Rowset_Abstract
{
}

class App_Model_Users_Row extends Zend_Db_Table_Row_Abstract
{
    protected function _insert()
    {
        // pre instert logic such as:
        $this->password = sha1($this->password);
    }

    protected function _postInsert()
    {
        // email user a welcome
    }

    protected function _postDelete()
    {
        // delete related files such as avatar
        // can also get a rowset of related many's to delete
    }

}

ここで詳細を読むことができますhttp://talentedmrjones.posterous.com/simple-models-with-zenddbtable

もちろん、私が Mojito_Model_Abstract から拡張しているすべての機能を必要としない、または望んでいないかもしれませんが、何が起こっているかの要点を理解していると確信しています。

于 2010-05-13T19:23:26.520 に答える