zend-framework - Zend - 设计模式数据映射器和表网关

标签 zend-framework design-patterns

这直接出自 Zend 快速入门指南。我的问题是:你为什么需要 setDbTable()方法当getDbTable()方法分配一个默认值 Zend_Db_Table目的?如果您知道此映射器使用特定表,为什么还要通过 setDbTable() 提供可能使用“错误”表的可能性? ?如果其余代码( find()fetchAll() 等)特定于 Guestbook ,您可以通过设置表格获得什么灵活性?

class Application_Model_GuestbookMapper 
{
    protected $_dbTable; 

    public function setDbTable($dbTable)
    {
        if (is_string($dbTable)) { 
            $dbTable = new $dbTable();
        }
        if (!$dbTable instanceof Zend_Db_Table_Abstract) {
            throw new Exception('Invalid table data gateway provided'); 
        }
        $this->_dbTable = $dbTable;
        return $this;
    }

    public function getDbTable() 
    {
        if (null === $this->_dbTable) { 
            $this->setDbTable('Application_Model_DbTable_Guestbook');
        }
        return $this->_dbTable;
    }

    ... GUESTBOOK SPECIFIC CODE ...
}

class Application_Model_DbTable_Guestbook extends Zend_Db_Table_Abstract
{
    protected $_name = 'guestbook_table';
}

最佳答案

Phil 是正确的,这被称为 lazy-loading design pattern .我刚刚在最近的一个项目中实现了这种模式,因为有以下好处:

  • 当我调用 getMember() 方法时,我会得到一个返回值,不管它之前是否设置过。这非常适合 method chaining :$this->getCar()->getTires()->getSize();
  • 这种模式提供了灵活性,因为外部调用代码仍然能够设置成员值:$myClass->setCar(new Car());

  • - 编辑 -

    在实现延迟加载设计模式时要小心。如果您的对象没有正确水合,则将为每条不可用的数据发出查询。最好的做法是在开发阶段跟踪数据库查询日志,以确保查询的数量和类型符合您的预期。我正在从事的一个项目是针对“详细信息”页面发出超过 27 个查询,直到我看到这些查询我才知道。

    关于zend-framework - Zend - 设计模式数据映射器和表网关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9217914/

    相关文章:

    zend-framework - 未捕获的异常 'Zend_View_Exception'

    python - 模块 "duck typing"有陷阱吗?

    model-view-controller - 是或否:MVC中的模型是否应包含应用程序逻辑?

    c - 服务器设计模式/最佳实践的最佳来源是什么?

    java - Java设计模式的最佳教程

    php - 如何设置baseUrl

    php - 获取数组中的 Youtube VideoID 详细信息

    php - Zend 应用程序的 PHPUnit 测试策略

    php - 使用 Zend 框架创建绝对 URL 的最佳实践?

    c# - 这个类设计是不是太接近db表结构了?