Basit Bir Model sadece Zend_Db_Row (aslında Active Record) uzatın miyim?

2 Cevap php

Ben Domain Modeller biliyorum ve Veri Haritacıları cepten züppe seçimi (Martin Fowler kimse kendini çağırır gibi, tamamlayıcı bir şekilde 'züppe' kullanarak) vardır - ancak, hatta Fowler says in POEAA that

"Active Record çok karmaşık olmayan etki alanı mantığı için iyi bir seçim ..."

Ben modellemek için basit bir ürün ve fatura etki modeli, çok değil birçok tablolar / nesneleri / kavramları var, ve ilişkiler bu aşırı karmaşık değildir. Yani, is this a good use case for Active Record?

Fowler da Active Record Satır Veri Ağ Geçidi, Active Record etki alanı mantığı olduğu varlık farka benzer olduğunu belirtiyor.

Bu Active Record için geçerli bir kullanım durumdur, ve varsayarak Zend Satır Veri Ağ Geçidi, bu nesneler uzanan (sadece tablo adını ekleyerek aksine) Zend Framework kullanarak Active Record nesneleri oluşturmak için iyi bir yol gibi görünüyor akıllı bir çözüm sağlar beri . Gerçekten de, that concept is discussed in this SO answer. Is this an acceptable way of implementing Active Record inside the Zend Framework?

Tabii ki bu sorunun en popüler cevap one by Bill Karwin (kim zerdüştlerin Db uygulanmasında görev) olduğunu, not kullanarak tavsiye Zend_Db_Table veya Zend_Db_Row bu şekilde (en azından ben okumak nasıl).

Ben tam Söz etki alanı modeli daha karmaşık hale gelirse Veri Mapper çözüme taşımak isteyen kabul eder. Ben (Söz sadece etki alanı modeli fazla, son zamanlarda cepten tasarım desenleri hakkında daha fazla okuma) çeşitli ORM / DataMappers baktım, ve onlar gerçekten bazı şeyler için çok fazla görünüyor.

2 Cevap

Bunu yaptım ve sonuç tamamen memnun olmuştur.

IMO, sen must never yapılacak tek şey kontrolörleri ve görünümler / görünümü yardımcıları ana yöntemleri kullanmaktır. yani her zaman uygulamanın geri kalanı tarafından kullanılan genişletilmiş Zend_Db_Table_Abstract ve Zend_Db_Table_Abstract_Row sınıflar kendi yöntemleri yazmak. Gerek görüldüğü takdirde bu daha karmaşık bir şey için TDG / AR üzerinden takas seçeneği size bırakacaktır.

Basit bir şey için, o zaman evet Zend_Db_Table paketi uzanan modelleri iyi bir seçimdir. Ben büyük bir başarı ile birçok kez kullandım, ve bu gibi bir şey görünüyor:

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
    }

}

Daha fazla burada okuyabilirsiniz http://talentedmrjones.posterous.com/simple-models-with-zenddbtable

Tabii ki gerekiyor veya Mojito_Model_Abstract uzanan ediyorum tüm işlevselliği istiyorum, ama ne oluyor yüreğin olsun eminim olmayabilir.