Zend_Db_Table_Row_Abstract Расширенный класс строк не функционирует - PullRequest
0 голосов
/ 26 января 2012

Я использую фреймворк 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 Framework 1.11.11.

[Edit] Вот пример использования:

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
            )));
    }
}

Я ожидаю, что по крайней мере какой-нибудь метод будет вызываться для класса строки при возврате сериализованных результатов...

[Update] Если я использую "fetchRow", все работает как положено;fetchAll просто не выполняет преобразование в базовый тип объекта.

1 Ответ

1 голос
/ 26 января 2012

Я только что посмотрел код для строки / аннотации класса.Попробуйте установить значение для $ _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();
...