Zend_Db_Table_Row_Abstract扩展行类不起作用

时间:2012-01-25 21:23:10

标签: php zend-framework zend-db

我正在使用Zend_Db框架,而且我遇到了麻烦。我正在尝试将自定义处理添加到行级别的列命名,但由于某种原因它无法调用我的函数。

我已经解决了这个问题,只是试着弄清楚是否甚至创建了基础的“Row”类。据我所知,事实并非如此。

这就是我所拥有的:

// this class functions correctly; I get "table" written to my output
class DHR_Table extends Zend_Db_Table_Abstract
{
    protected $_rowClass = 'DHR_Row';

    function __construct(){
        echo "table";
        parent::__construct();
    }
}

// this class never gets called, at least not that is evident from the constructor echo
class DHR_Row extends Zend_Db_Table_Row_Abstract
{
    protected $inflector = null;

    function __construct(){
        echo "row";
        parent::__construct();
    }
}

// this is the actual implementation class that uses these two:
class Application_Model_DbTable_Applicants extends DHR_Table
{
    protected $_name = 'applicants';
}

我的输出包括一些数据(从这篇文章中排除,但是“申请人”类的一部分)和“表”,但没有“行”。任何想法为什么会这样? Zend框架的1.11.11版。

[编辑] 这是用法:

class ApplicantsController extends DHR_RestController
{    
    public function indexAction()
    {
        $applicants = new Application_Model_DbTable_Applicants();
        $result = $applicants->fetchAll();
        $this->success($result);
    }
    protected function success($data, $code = 200)
    {
            if(is_a($data, 'Zend_Db_Table_Rowset')){
                    // we could do some pagination work here
                    $data = $data->toArray();
            }
            $this->setResponseCode($code)->appendBody(Zend_Json::encode(array(
                    'success'=>true,
                    'data' => $data
            )));
    }
}

我希望在返回序列化结果时,至少会对调用的行类有一些方法...

[更新] 如果我使用“fetchRow”,一切都按预期工作; fetchAll根本不会转换为基础对象类型。

1 个答案:

答案 0 :(得分:1)

我只是在查看 row / abstract 类的代码 尝试为$ _tableClass设置一个值。
$_tableClass = 'DHR_Table';

我担心它不会起作用,因为它看起来像 Zend / Db / Table / Row / Abstract.php 无论如何都要寻找一个表定义,所以如果没有进一步扩展,你似乎可能无法实现抽象。

//excerpt from __construct Zend/Db/Table/Row/Abstract.php

public function __construct(array $config = array())
    {
        if (isset($config['table']) && $config['table'] instanceof Zend_Db_Table_Abstract) {
            $this->_table = $config['table'];
            $this->_tableClass = get_class($this->_table);
        } elseif ($this->_tableClass !== null) {
            $this->_table = $this->_getTableFromString($this->_tableClass);
        }
 // cont...
 // Retrieve primary keys from table schema
        if (($table = $this->_getTable())) {
            $info = $table->info();
            $this->_primary = (array) $info['primary'];
        }

        $this->init();