我需要找出在Zend Framework中有效利用模型的最佳实践。
目前,我有一些扩展Zend_Db_Table_Abstract
的类,它可以处理我对每个类的相应表的查询。
当我需要从控制器访问这些表中的5个表时,我发现自己为每个特定的Zend_Db_Table
对象创建了5个新实例。这真的无效。
我考虑过实现Factory模式来创建新实例(或提供现有的静态副本),但我不确定。这是最好的方式吗?
处理模型以确保速度而不消耗过多资源的正确方法是什么?延迟加载应该在这里发挥作用吗?
[编辑] 作为一个例子,我有一个类用于处理从原始搜索查询获取有关位置的详细信息,并需要这些对象来解析查询:
// Initialize database object
$this->dbLocations = new Model_Locations;
$this->dbStates = new Model_States;
$this->dbZipcodes = new Model_Zipcodes;
$this->dbLookup = new Model_Lookup;
在另一个课程中,我可能需要再次访问这些模型,所以我重复上面的代码。基本上重新初始化可能为静态/单例的对象。
答案 0 :(得分:3)
我倾向于像你一样在DbTable工作。当我需要在单个动作中查询多个表以在dbTable之上创建另一个模型层时,我发现它很有效。与服务或域层类似。这样我只需要调用一个模型,但我仍然拥有我需要的功能。
这是一个简单的例子,可能最终与5个DbTable类进行交互,并且很可能还有几个Row类:
<?php
class Application_Model_TrackInfo
{
protected $_track;
protected $_bidLocation;
protected $_weekend;
protected $_shift;
protected $_station;
public function __construct() {
//assign DbTable models to properties for convience
$this->_track = new Application_Model_DbTable_Track();
}
/**
*
* @param type $trackId
* @return type object
*/
public function getByTrackId($trackId) {
$trackData = $this->_track->fetchRow($trackId);
//getAllInfo() Application_Model_Row_TRack
$result = $trackData->getAllInfo();
//returns std object reflecting data from 3 DbTable classes
return $result;
}
/**
*Get Station from trackid through bidlocationid
*
* @param type $trackId
* @return type object
*/
public function getStation($trackId){
$data = $this->_track->fetchRow($trackId);
//This a Application_Model_Row_Track method
$result= $data->getStationFromBidLocation();
return $result;
}
}
我希望这会有所帮助。
<强> [编辑] 强>
自从我写这个答案以来,我已经了解了域模型和数据映射器的好处。哇我的应用程序有什么不同。不是一个神奇的子弹,而是一个巨大的进步
谢谢你
亚历杭德罗·格瓦西奥在PHPMaster.com时结束了
Rob Allen在Akrabat.com发誓
和
PádraicBrady在Surviving The Deepend
帮助他们理解这种模式。
答案 1 :(得分:1)
您似乎有可能需要使用当前Zend框架未附带的功能进行高效的数据管理。 Zend没有用于处理任何类型数据库的内置引擎,它只是有一个包装类,可以帮助您编写查询。
您需要的是对象关系模型(ORM),它是专业框架中必不可少的。据我了解,ORM本身就是一个框架,它具有模式和强烈定义的“做事”方式,支持延迟加载(它需要大部分时间)并最大限度地优化您的查询。当您使用ORM时,您甚至不编写SQL,而是需要更改数据存储的解释,您需要忘记表并关注对象。例如,在Doctrine中,每个类型(表)由一个Class指定,每个记录(行)作为一个类实例指定,您可以访问不同的方法和属性。它支持事件监听器和疯狂的级联关联。
删除记录时不再需要从相关表中提取行(它是自动的),不再需要编写复杂和混乱的脚本来确保文件系统同步,您可以随时迁移到几乎任何数据库引擎(mysql, postgresql,simplesql ..)等等..
我一直在使用Doctrine 2和Symfony 2框架,我不得不说我不会回到Zend做任何事情。是的,它既复杂又沉重,但却是最终的解决方案。当你需要管理数百个包含数百万条记录的表时,你会看到差异。
所以,最终总结: ORM是你需要的,有很多解决方案,我知道两个非常好:Doctrine 1或2和Propel。
P.S。:ORM是你系统的一个独立部分,因此你并不需要使用特定的框架,可以将Zend配置为与Doctrine一起使用:)