简单模型可以扩展Zend_Db_Row(本质上是Active Record)吗?

时间:2010-05-12 17:56:20

标签: php oop zend-framework activerecord datamapper

我知道领域模型和数据映射器是OOP势利者的选择(以互补的方式使用“势利小人”,正如Martin Fowler所说的那样) - 然而,甚至Fowler says in POEAA that

  

“Active Record是一个不太复杂的域逻辑的好选择......”

我有一个简单的产品和发票领域模型,没有太多的表/对象/概念来建模,并且关系不是那么复杂。那么,这是Active Record的一个很好的用例吗?

Fowler还指出Active Record类似于Row Data Gateway,不同之处在于Active Record具有域逻辑。

假设这是Active Record的有效用例,并且由于Zend提供了行数据网关,因此扩展这些对象的智能解决方案(而不是简单地添加表名)似乎是使用它创建Active Record对象的好方法Zend框架。的确,that concept is discussed in this SO answer这是在Zend Framework中实现Active Record的可接受方式吗?

当然,对这个问题最热门的答案是one by Bill Karwin(曾参与Zend的Db实施工作),建议使用Zend_Db_TableZend_Db_Row这种方式(至少那是我读它的方式)。

如果有问题的域模型变得更复杂,我完全接受想要转向Data Mapper解决方案。我已经看过各种ORM / DataMapper(不仅仅是有关的领域模型,最近还在阅读更多关于OOP设计模式的内容),而且对于某些事情它们看起来真的太多了。

2 个答案:

答案 0 :(得分:3)

我做到了这一点并对结果完全满意。

IMO,您必须 从不做的唯一事情就是使用控制器和视图/视图助手中的父方法。即始终在扩展的Zend_Db_Table_Abstract和Zend_Db_Table_Abstract_Row类中编写自己的方法,这些类由应用程序的其余部分使用。如果需要,这将使您可以选择将TDG / AR换成更复杂的东西。

答案 1 :(得分:2)

对于简单的东西,那么扩展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扩展的所有功能,但我确信您会了解正在发生的事情。