加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

zend-framework – Zend – 设计模式DataMapper和表网关

发布时间:2020-12-13 17:10:45 所属栏目:PHP教程 来源:网络整理
导读:这直接来自Zend快速入门指南.我的问题是:当getDbTable()方法分配默认的Zend_Db_Table对象时,为什么需要setDbTable()方法?如果您知道此映射器使用特定表,为什么甚至提供可能通过setDbTable()使用“错误”表?如果代码的其余部分(find(),fetchAll()等)是特定
这直接来自Zend快速入门指南.我的问题是:当getDbTable()方法分配默认的Zend_Db_Table对象时,为什么需要setDbTable()方法?如果您知道此映射器使用特定表,为什么甚至提供可能通过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个查询,直到我看到查询才知道.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读