2011-11-11 9 views
0

私は、デフォルトのZend ORMシステムを拡張しようとしています。つまり、Zend_Db_Tableを介してDbからデータを取得すると、後でこのデータをZend_Db_Table_RowsetまたはZend_Db_Table_Rowクラスを使用して処理できます。 私の考えでは、このようなカスタムファクトリクラスを使用することです:アイデアのzend_db_table setRowClassは、Zend_Db_Table_Rowの代わりに私のカスタムクラスをバインドしません。

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

} 

コアは、要求CLASS_NAMEが定義されている場合は、私の工場が見えるようにすることであり、それがある場合は、インスタンス化のZend_Db_TableクラスのrowClassとしてCore_Model_Itemを取得できません。確かに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

スローされる致命的なエラーは、空のクラスがZend_Loaderに送信されたためです。 $db_table_classが空の文字列になり、$class_name引数が空になっているようです。 Go_Factory::get();に電話している場所を確認し、文字列が空でないことを確認してください。また

、あなたはこれを変更する必要があります。これに

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

if (!class_exists($db_table_class)) {