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(); – 编辑 – 实现延迟加载设计模式时要小心.如果您的对象没有适当的水合,则会针对不可用的每个数据发出查询.最好的办法是在开发阶段拖尾数据库查询日志,以确保查询的数量和类型符合您的预期.我正在研究的一个项目是针对“详细”页面发出超过27个查询,直到我看到查询才知道. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |