如何在Zend框架中优化模型?

时间:2012-02-21 15:43:53

标签: php database oop zend-framework

我需要找出在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;

在另一个课程中,我可能需要再次访问这些模型,所以我重复上面的代码。基本上重新初始化可能为静态/单例的对象。

2 个答案:

答案 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一起使用:)