Zend框架数据映射器+分页器

3

我主要使用zend_db_table和paginator,但问题是它返回的是zend_db_rows而不是来自我的数据映射器的域对象。

举个例子:

class Content_Model_ArticleMapper {
/*
 * @param Zend_Db_Select $select
 * @return Zend_Paginator
 */
    public function getPaginator($select = null){}
}

我可以通过在自定义行集中覆盖 _loadAndReturnRow 方法来进行黑客攻击。 然而,这是相当丑陋的,因为当我查询表时,我不再拥有 Zend_Db_Row 了。 并且也失去了像 save 这样的方法,我不想在领域对象上复制它们。

class Content_Model_DbTable_Rowset_Articles extends Zend_Db_Table_Rowset {
        protected function _loadAndReturnRow($position)
    {
    if (!isset($this->_data[$position])) {
        require_once 'Zend/Db/Table/Rowset/Exception.php';
        throw new Zend_Db_Table_Rowset_Exception("Data for provided position does not exist");
    }

    // do we already have a row object for this position?
    if (empty($this->_rows[$position])) {

        $this->_rows[$position] = new Content_Model_Article($this->_data[$position]);
    }

    // return the row object
    return $this->_rows[$position];
    }
}

我的问题是如何优雅地实现这个功能? :) 你需要编写自定义的分页适配器吗?


"你写过自定义的Paginator适配器吗?" 是的,我相信这是唯一的最佳实践。 - Martijn
1个回答

1

在您的DbTable中,您可以设置rowClass,例如:

DbTable

class Content_Model_DbTable_Article extends Zend_Db_Table_Abstract {

    protected $_name = 'article';

    public function init() {
        $this->setRowClass('Content_Model_Article');
    }

}

领域模型

class Content_Model_Article extends Zend_Db_Table_Row {

    //for example
    public function getAuthorFullName() {
        return $this->author_firstname . ' ' . $this->author_lastname;
    }

}

现在,您的行集中的行是 Content_Model_Article 的实例,您可以使用 Zend_Paginator_Adapter_Iterator。

使用 Paginator

$articleTable = new Content_Model_DbTable_Article();
$articleRowset = $articleTable->fetchAll();
$paginator = new Zend_Paginator(Zend_Paginator_Adapter_Iterator($articleRowset));
//now you can loop through the paginator
foreach($paginator as $article) {
    echo $article->getAuthorFullName();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接