2011-05-15 91 views
2

Zend框架。 我想自動加載我的模型類模型文件夾內,從引導類。 這些模型實際上並不使用任何命名空間(所以我有Ex。User.php文件的類名爲User等等..)。Zend自動加載模型問題

如果我理解正確,我應該用Zend_Loader_Autoloader_Resource,我嘗試:

function _initLoaderResource() 
{   
    $resourceLoader = new Zend_Loader_Autoloader_Resource(array(     
    'basePath' => APPLICATION_PATH,//points to the "application" path where resides "models" folder 
    'namespace' =>''  
    ));   

    $resourceLoader->addResourceType('models', 'models/'); 

} 

並且收到以下 'Zend_Loader_Exception' 消息:

'Initial definition of a resource type must include a namespace' 

我的問題是:

  • 這是正確的方式來自動加載模型?
  • 我應該如何管理不符合Zend Framework編碼標準的資源代碼?

回答

5

實際上,您可能不希望爲此使用資源自動加載器,因爲(正如您發現的那樣)它需要一個名稱空間。標準自動加載器(加載包含路徑中的模型)有一個選項setFallbackAutoloader,它告訴ZF該自動加載器應該用於任何不匹配另一個名稱空間的類。因此,您只需確保您的模型目錄位於包含路徑中,並將此選項設置爲true。

您可能已經在使用標準自動加載器加載Zend類,因此您可能需要修改application.ini文件以將模型目錄添加到包含路徑,然後在應用程序中設置回退選項.ini或在您的Bootstrap類中:

protected function _initAutoloader() 
{ 
    $autoloader = Zend_Loader_Autoloader::getInstance(); 
    $autoloader->setFallbackAutoloader(true); 

    return $autoloader; 
} 
+0

Yu答案是完美的!謝謝 – 2013-05-22 11:49:44

+0

太棒了!謝謝! – Wiktor 2014-06-14 17:53:13

1

Zend Autoloader使用命名空間來確保您沒有使用autoload進程,對那些你不想要的類。所以你必須爲你的類選擇一個名字空間。

您可以使用特定於應用程序的命名空間或通用命名空間來啓動您的類。 像'My_'或'App_'這樣的命名空間是通用的,但是例如如果你的應用程序名稱是Job Board,你可以在你的類文件中使用'JB_'這樣的命名空間。

您也可以編寫自己的自動加載器(全新的或者擴展Zend自動加載器)並將其註冊爲SPL autoloader以繞過此操作。

您的類名不一定要遵循Zend Framework命名約定,只要確保它們具有名稱空間並在自動裝載器中註冊名稱空間即可。

在這裏,我附上了一段代碼,它註冊了一些要自動加載的資源。我有多個模塊,每個模塊都有一個關於該模塊名稱的命名空間。請注意,由於有很多命名空間,我將它們全部註冊爲一個循環。

$nameSpaceToPath = array(
          'Application' => APPLICATION_PATH, 
          'Base'   => APPLICATION_PATH . '/base', 
          'Store'  => APPLICATION_PATH . '/modules/Store', 
          'Payment'  => APPLICATION_PATH . '/modules/Payment', 
          'Admin'  => APPLICATION_PATH . '/modules/Admin' 
         ); 

    foreach($nameSpaceToPath as $ns => $path) { 
     $autoLoaderResource = new Zend_Loader_Autoloader_Resource(
          array(
           'basePath' => $path, 
           'namespace' => $ns 
          ) 
         ); 
     $autoLoaderResource->addResourceType('controller','controllers','Controller'); 
     $autoLoaderResource->addResourceType('model','models','Model'); 
     $autoLoaderResource->addResourceType('mapper','models/mappers','Model_Mapper'); 
     $autoLoaderResource->addResourceType('service','services','Service'); 
     // I'm using _Util_ in the name of my utility classes, I place them in 'utils' directory 
     $autoLoaderResource->addResourceType('util','utils','Util'); 
     $autoLoaderResource->addResourceType('plugin','plugins','Plugin'); 
     $autoLoaderResource->addResourceType('form','forms','Form'); 
     // I'm using _Exception_ in the name of my module specific exception classes, I place them in 'exceptions' directory 
     $autoLoaderResource->addResourceType('exception','exceptions','Exception'); 
     $autoLoader->pushAutoloader($autoLoaderResource); 
    } 

當你通過調用定義資源類型:

$autoLoaderResource->addResourceType('service','services','Service'); 

你實際上是告訴你有一種「服務」(第1 PARAM),這是擺在指定的目錄Zend的自動裝彈機'services'(第二參數),並且您在類名中使用'Service'標記來指定此類的類。

上述代碼告訴Zend Autoloader在路徑'APPLICATION_PATH/modules/store/services/Core.php'中搜索類Store_Service_Core。

正如你所看到的,我已經爲APPLICATION_PATH路徑註冊了'Application'命名空間。這意味着每個以Application_開頭的類都將從APPLICATION_PATH自動加載。因此,例如我有一個名爲Application_Init的類,它使用了一些初始化任務,現在Zend從路徑APPLICATION_PATH/Init.php中自動加載它。