Может ли простая модель просто расширить Zend_Db_Row (по сути, активную запись)? - PullRequest
0 голосов
/ 12 мая 2010

Я знаю, что доменные модели и картографы данных являются выбором сноба ООП (используя 'сноб' дополняющим образом, как его называет Мартин Фаулер) - однако даже Фаулер говорит в POEAA, что

«Active Record - хороший выбор для логики домена, которая не слишком сложна ...»

У меня есть простая модель домена продукта и счета, не слишком много таблиц / объектов / концепций для моделирования, и отношения не слишком сложны. Итак, это хороший вариант использования Active Record?

Фаулер также утверждает, что Active Record похожа на шлюз данных Row, с той разницей, что Active Record имеет доменную логику.

Предполагая, что это действительный вариант использования Active Record, и, поскольку Zend предоставляет Row Data Gateway, интеллектуальное решение (в отличие от простого добавления имени таблицы), расширяющее эти объекты, кажется хорошим способом создания объектов Active Record с использованием Zend Framework. Действительно, эта концепция обсуждается в этом ответе SO . Является ли это приемлемым способом реализации Active Record в Zend Framework?

Конечно, самым популярным ответом на этот вопрос является один от Билла Карвина (который работал над реализацией Zend's Db), который рекомендует не , используя Zend_Db_Table или Zend_Db_Row таким образом (по крайней мере, так я это прочитал).

Я полностью согласен с желанием перейти к решению Data Mapper, если рассматриваемая модель предметной области становится более сложной. Я посмотрел на различные ORM / DataMappers (не только для рассматриваемой модели предметной области, в последнее время читал больше о шаблонах проектирования ООП), и они действительно кажутся слишком большими для некоторых вещей.

Ответы [ 2 ]

3 голосов
/ 12 мая 2010

Я сделал это и был полностью удовлетворен результатом.

IMO, единственное, что вы должны никогда делать, это использовать родительские методы в ваших контроллерах и помощниках представлений / представлений. Т.е. всегда пишите свои собственные методы в расширенных классах Zend_Db_Table_Abstract и Zend_Db_Table_Abstract_Row, которые используются остальной частью вашего приложения. Это даст вам возможность поменять свой TDG / AR на что-то более сложное, если возникнет такая необходимость.

2 голосов
/ 13 мая 2010

Для чего-то простого, тогда да, модели, расширяющие пакет Zend_Db_Table, являются хорошим выбором. Я использовал его много раз с большим успехом, и это выглядит примерно так:

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, но я уверен, что вы понимаете суть происходящего.

...