0

我知道领域模型和数据映射器是 OOP 势利小人的选择(以互补的方式使用“势利小人”,正如 Martin Fowler 自称的那样)——然而,即使是 Fowler在 POEAA 中也说

“对于不太复杂的领域逻辑,Active Record 是一个不错的选择……”

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

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

假设这是一个有效的 Active Record 用例,并且由于 Zend 提供 Row Data Gateway,扩展这些对象的智能(而不是简单地添加表名)解决方案似乎是使用 Zend 框架创建 Active Record 对象的好方法. 事实上,这个概念在这个 SO answer 中讨论过这是在 Zend 框架内实现 Active Record 的一种可接受的方式吗?

当然,这个问题最流行的答案是Bill Karwin(他曾参与 Zend 的 Db 实现)的一个答案,他建议不要使用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 包的模型是一个不错的选择。我已经多次使用它并取得了巨大的成功,它看起来像这样:

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 回答