Метод абстрактной модели строки таблицы Zend - PullRequest
0 голосов
/ 13 апреля 2011

У меня очень специфическая проблема с моим приложением Zend Framework. Я использую свой собственный класс Model с именем My_Model, который является синглтоном, и я использую его для вызова моделей БД. Каждая модель расширяет класс My_Db_Table и имеет класс строки, который расширяет My_Db_Table_Row. Когда я вызываю модель, все в порядке, но модель, кажется, игнорирует модель класса строк. Кто-нибудь может мне посоветовать, что я делаю не так?

Пользовательский класс:

class My_Model {

protected static $_instance = null;

protected $_services = array();    

private function __construct() {        

}



/**

 * Service classed is called by it's name

 *

 * @param string $name

 * @return My_Db_Table

 */

public function getService($name) {

    if (!isset($this->_services[$name])) {

        $service = new $name();  

        if (!$service instanceof Zend_Db_Table_Abstract) {

            $type = gettype($service);

            if ($type == 'object') {

                $type = get_class($service);
            }

            throw new Zend_Db_Table_Row_Exception("Class must be a Zend_Db_Table_Abstract, but it is $type");

        }

        $this->_services[$name] = $service;

    }

    return $this->_services[$name];

}


}

Классы Zend_Db_Table:

<?php

/**

 * This class represents a DB table

 *

 */

class My_Db_Table extends Zend_Db_Table_Abstract {



/**

 * Fetches the table row by primary key

 *

 * @param string $id

 * @return Product

 */

public function getById($id) {

    return $this->find($id)->current(); 

}

}

Строка класса:

<?php

/**

 * Row class

 *

 */

class My_Db_Table_Row extends Zend_Db_Table_Row_Abstract {

/**

 * Inflector to get the attribute name

 * camelCase -> under_score

 *

 * @param string $columnName

 * @return string

 */

protected function _transformColumn($columnName) {

    $inflector = new Zend_Filter_Inflector ( ":string" );

    $inflector->setRules ( array (

    ':string' => array ('Word_CamelCaseToUnderscore', 'StringToLower' ) ) )

    ;

    $columnName = $inflector->filter ( array ('string' => $columnName ) );

    return $columnName;

}

/**

 * Magic method hook to catch getters and setters

 *

 * @param string $method

 * @param array $args

 */

public function __call($method, array $args) {

    $matches = array ();

    if (preg_match ( '/^get(\w+?)$/', $method, $matches )) {

        $attribute = $matches [1];

        return $this->{$attribute};

    }

    if (preg_match ( '/^set(\w+?)$/', $method, $matches )) {

        $attribute = $matches [1];

        $this->{$attribute} = (count ( $args ) == 1) ? $args [0] : null;

        return;

    }

    return parent::__call ( $method, $args );

}

}

Чтобы использовать эти классы, я использую следующий код:

$record = My_Model::getInstance ()->getService ( 'Users' )->getById ( 1 );
$record->updateFromArray(array('auth_token' => 'asfsgfgswg'));

И я получаю следующее сообщение об ошибке:

Message: Unrecognized method 'updateFromArray()'
Stack trace:

#0 /home/www/fbdrives/application/modules/facebook/controllers/IndexController.php(34): Zend_Db_Table_Row_Abstract->__call('updateFromArray', Array)
#1 /home/www/fbdrives/application/modules/facebook/controllers/IndexController.php(34): Zend_Db_Table_Row->updateFromArray(Array)
#2 /home/www/fbdrives/library/Zend/Controller/Action.php(513): Facebook_IndexController->indexAction()
#3 /home/www/fbdrives/library/Zend/Controller/Dispatcher/Standard.php(295): Zend_Controller_Action->dispatch('indexAction')
#4 /home/www/fbdrives/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#5 /home/www/fbdrives/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()
#6 /home/www/fbdrives/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#7 /home/www/fbdrives/public/index.php(27): Zend_Application->run()
#8 {main}  

Класс Users:

 <?php

/**
 * User table model class
 *
 */
class Users extends My_Db_Table {

    /**
     * The DB table name
     *
     * @var string
     */
    protected $_name = 'user';

    /**
     * The row class name
     *
     * @var string
     */
    protected $_rowclass = 'User';

}

Класс User, который не вызывается методом updateFromArray:

<?php

/**
 * The user model class
 *
 */
class User extends My_Db_Table_Row {


    /**
     * Update values by array values
     *
     * @param array $values
     */
    public function updateFromArray(array $values) {
        $this->setFromArray($values);
        $this->save();
        return $this;
    }
}

Я предоставлю любую необходимую информацию, если это необходимо. Я действительно застрял на этом в течение нескольких дней, и, кажется, ничто не помогает. Метод updateFromArray находится в классе User, но класс загружен неправильно.

Заранее спасибо за любую помощь!

1 Ответ

1 голос
/ 13 апреля 2011

Я думаю, что проблема может быть в том, что вы используете $ _rowclass, а не $ _rowClass (с заглавной буквы C).

Если вместо этого поставить эту строку, она может работать:

protected $_rowClass = 'User';

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

...