zend_db_table setRowClass не привязывать мой пользовательский класс вместо Zend_Db_Table_Row - PullRequest
0 голосов
/ 12 ноября 2011

В идее писать меньше, я пытаюсь расширить стандартную систему Zend ORM.Я имею в виду, если мы получим из Db некоторые данные через Zend_Db_Table, мы сможем позже обработать эти данные, используя классы Zend_Db_Table_Rowset или Zend_Db_Table_Row.Моя идея состоит в том, чтобы использовать пользовательский класс Factory следующим образом:

class Go_Factory {

    const PREFIX = 'mule_';

    /**
    * get from database item by specified primary key
    *
    */
    public static function get( $class_name, $identity ){
        return self::getDbTable( $class_name )->find( $identity );
    }

    /**
    * well, there is a corelation between class name and represented by it table name in DB
    * so let's get one from another
    * return instance of Zend_Db_Table with defined _name and _rowclass parameters and 
    */
    public static function getDbTable( $class_name ){
        $db_table_class = str_replace( "Model_", "Model_DbTable_", $class_name ) . "s";
        $row_class = class_exists( $class_name ) ? $class_name : "Core_Model_Item";

        if( !( class_exists( $db_table_class ) ) ){

            $temp = explode( "_", $class_name );
            $table_postfix = strtolower( preg_replace( '/([^A-Z])([A-Z])/', "$1_$2", $temp[ 2 ] ) );
            $table_name = Zend_Registry::get( 'prefix' ) . strtolower( $temp[ 0 ] ) . '_' . $table_postfix . 's';
            $db_table = new Zend_Db_Table( array( 'name' => $table_name ) );
            $db_table->setRowClass( $row_class );
            return $db_table;
        } else {
            return new $db_table_class();
        }
    }

}

Суть идеи заключается в том, чтобы заставить мой Factory выглядеть, если определено запрошенное имя_класса и если оно не получает Core_Model_Item как rowClass экземпляра класса Zend_Db_Table.Конечно, Core_Model_Item расширяет класс Zend_Db_Table_Row.

Строка $db_table->setRowClass( $row_class ); не действует!Я попытался проверить, успешно ли определен rowClass, просто поставив var_dump( $db_table->getRowClass() ); сразу после определения, и он показывает "" - ничего не установлено!И в последнее время это приносит мне следующую ошибку:

Warning: include_once(.php) [function.include-once]: failed to open stream: ��� ������ ����� ��� �������� in /home/users2/n/newpanel/domains/newpanel.jino/library/Zend/Loader.php on line 146

Warning: include_once() [function.include]: Failed opening '.php' for inclusion (include_path='/home/users2/n/newpanel/domains/newpanel.jino/application/../library:/home/users2/n/newpanel/domains/newpanel.jino/library:.:/usr/local/zend/share/pear') in /home/users2/n/newpanel/domains/newpanel.jino/library/Zend/Loader.php on line 146

Fatal error: Uncaught exception 'Zend_Exception' with message 'File ".php" does not exist or class "" was not found in the file' in /home/users2/n/newpanel/domains/newpanel.jino/library/Zend/Loader.php:99 Stack trace: #0 /home/users2/n/newpanel/domains/newpanel.jino/library/Zend/Db/Table/Abstract.php(1357): Zend_Loader::loadClass('') #1 /home/users2/n/newpanel/domains/newpanel.jino/library/Go/Factory.php(30): Zend_Db_Table_Abstract->fetchAll(Object(Zend_Db_Table_Select)) #2 /home/users2/n/newpanel/domains/newpanel.jino/application/modules/core/plugins/Acl.php(22): Go_Factory::reference('User_Model_Role') #3 /home/users2/n/newpanel/domains/newpanel.jino/application/Bootstrap.php(28): Core_Plugin_Acl::getAcl() #4 /home/users2/n/newpanel/domains/newpanel.jino/library/Zend/Application/Bootstrap/BootstrapAbstract.php(667): Bootstrap->_initNavigation() #5 /home/users2/n/newpanel/domains/newpanel.jino/library/Zend/Application/Bootstrap/BootstrapAbstract.php(620): Zend_Application_Bootstrap_BootstrapAbstract->_executeResource('na in /home/users2/n/newpanel/domains/newpanel.jino/library/Zend/Loader.php on line 99

Пожалуйста, помогите мне выяснить, если я делаю что-то не так.

1 Ответ

1 голос
/ 12 ноября 2011

Неустранимая ошибка, возникающая из-за того, что пустой класс отправляется в Zend_Loader.Похоже, что $db_table_class приводит к пустой строке, что означает, что аргумент $class_name также является пустым.Проверьте, куда вы звоните Go_Factory::get(); и убедитесь, что ваша строка там не пустая.

Кроме того, вы должны изменить это:

if( !( class_exists( $db_table_class ) ) ){

на это:

if (!class_exists($db_table_class)) {
...