Zend 框架中的模型

您在 Zend 框架中实现模型的方法有哪些?

我已经看到了基本的,然后在你的控制器中调用它:class User extends Zend_Db_Table_Abstract

$foo = new User;

$foo->fetchAll()

但是更复杂的用途呢?文档的快速入门部分提供了这样一个示例,但我仍然觉得我没有得到Zend Framework中模型的“最佳使用”示例。有什么有趣的实现吗?


编辑:我应该澄清(回应CMS的评论)...我知道做更复杂的选择。我对模型概念的整体方法以及其他人如何实现它们的具体示例感兴趣(基本上,手册遗漏的内容以及基本操作方法所掩盖的内容)


答案 1

我为Zend工作,并在Zend_Db_Table组件上做了相当多的工作。

Zend Framework没有就领域模型模式的“模型”概念提供很多指导。模型没有基类,因为模型封装了特定于应用程序的业务逻辑的某些部分。我写了一篇关于这个主题的博客,更详细地介绍了这个主题。

数据库的持久性应该是模型的内部实现细节。模型通常使用一个或多个表。将模型视为表的扩展是一种常见但不恰当的面向对象设计。换句话说,我们应该说模型 HAS-A 表 ,而不是模型 IS-A 表。

这是 IS-A 的一个示例:

class MyModel extends Zend_Db_Table_Abstract
{
} 

这是 HAS-A 的一个示例:

class MyModel // extends nothing
{
    protected $some_table;
}

在实际的域模型中,您将在 MyModel 的方法中使用 $some_table。

您还可以阅读Martin Fowler对领域模型设计模式的看法,以及他对Anemic领域模型反模式的描述,不幸的是,许多开发人员正在接近OO编程。


答案 2

我个人将 和 都归类为 .我的代码和你的代码之间的主要区别在于,它显式地将 的子类视为“表”和“行”。我很少看到对控制器中选择对象、SQL 或内置 ZF 数据库方法的直接调用。我试图隐藏请求特定记录的逻辑,如下所示:Zend_Db_Table_AbstractZend_Db_Table_Row_AbstractZend_Db_Table_AbstractZend_Db_Table_Row_AbstractZend_Db_Table_Abstract

class Users extends Zend_Db_Table_Abstract {

    protected $_name = 'users';

    protected $_rowClass = 'User'; // <== THIS IS REALLY HELPFUL

    public function getById($id) {
        // RETURNS ONE INSTANCE OF 'User'
    }

    public function getActiveUsers() {
        // RETURNS MULTIPLE 'User' OBJECTS            
    }

}

class User extends Zend_Db_Table_Row_Abstract {

    public function setPassword() {
        // SET THE PASSWORD FOR A SINGLE ROW
    }

}

/* CONTROLLER */
public function setPasswordAction() {

    /* GET YOUR PARAMS */

    $users = new Users();

    $user = $users->getById($id);

    $user->setPassword($password);

    $user->save();
}

有很多方法可以解决这个问题。不要以为这是唯一的一个,但我试图遵循采埃孚设计的意图。(以下是我对这个主题的更多想法和链接。这种方法确实有点类繁重,但我觉得它使控制器专注于处理输入并与视图协调;让模型执行特定于应用程序的工作。


推荐