2011-04-09 50 views
4

某人如何自動加載每個模塊的每個表單和模型?請看下面的文件結構:自動加載Zend中每個模塊的表單和模型?

application/ 
    modules/ 
     foo/ 
      forms/ 
       Register.php 
      models/ 
       Account.php 
     Bootstrap.php 
     bar/ 
      forms/ 
       Publish.php 
      models/ 
       Article.php 
     Bootstrap.php 
    Bootstrap.php 

而且例如,在富/ bootstrap.php中您有以下(非功能性)代碼:

class Foo_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 
    protected function _initAutoLoad() 
    { 
     $loader = new Zend_Loader_Autoloader_Resource(array(
      'basePath' => APPLICATION_PATH . '/modules/foo', 
      'namespace' => 'Foo', 
     )); 

     $loader->addResourceType('form', 'forms', 'Form') 
      ->addResourceType('model', 'models', 'Model'); 
     return $loader; 
    } 
} 

基本問題:引導程序如何進行修改,以便它可以從Foo模塊加載每個表單和模型?

額外問題:是否有可能有加載從模塊形式和車型全球自動加載磁帶機?如果是這樣,怎麼樣?

編輯(有關該問題的最常見的問題):

  • 默認的Zend命名約定被用於類。如Bar_Model_ArticleBar_Model_Mapper_ArticleBar_Model_DbTable_ArticleBar_Form_Publish,...(而且被放置在各自的文件夾。)

  • 它不只是一個模塊沒有得到它的類加載,它的所有的人。

  • 使用帶有多個模型,映射器,dbtables和表單的普通no-module應用程序時,使用Zend自動加載器自動加載類沒有問題。

修復

由於@Tim噴泉提到的模塊白手起家都沒有運行,這意味着沒有自動加載的發生的真實烤到Zend。最終,我發現問題出在我的情況下。我不得不從我的配置中刪除以下行:

bootstrap.path = APPLICATION_PATH "/Bootstrap.php" 
bootstrap.class = "Bootstrap" 

同意,全局bootstrap不再工作了;但比模塊引導程序無法正常運行要好得多。如果有人知道如何擁有全球引導,請隨時發表評論。希望這可以幫助其他類似問題的人。

+0

你需要什麼?您可以使用RecursiveDirectoryIterator(http://php.net/manual/en/class.recursivedireiteiteite.php)遞歸地遍歷所有模塊目錄並加載所有文件。 – Zyava 2011-04-09 10:37:17

+0

@Zyava我寧願採用正確的方式,而不是簡單的方式。 Zend優化了類加載,這對於網站和開發人員來說總是一個優點。無論如何,感謝您的鏈接,我會看看它。 – levivanzele 2011-04-09 12:26:42

回答

5

模塊引導類自動設置模塊自動加載器,因此您可以刪除示例_initAutoload()函數,只留下一個空類,它應該都可以工作。見:http://framework.zend.com/manual/en/zend.loader.autoloader-resource.html#zend.loader.autoloader-resource.module

編輯:這聽起來像你的模塊bootstraps沒有運行。這並不是一個不常見的問題,因爲它們的組合方式可能有點混亂。驗證這種方法的最快方法是隻用一個回顯和一個退出來爲其中一個init方法添加一個init方法,看它是否有輸出。

模塊引導程序由Zend Application內的'模塊'資源引入並運行。你需要以某種方式觸發這個資源,因爲ZF不會爲模塊bootstraps而去尋找,以防他們在那裏。執行此操作的最常見方法是將此行包含在您的應用程序中。INI:

resources.modules[] = "" 

您也可以手動設置從你的主引導程序文件中的資源。

+0

我遵循正確的結構,但它不起作用。只有在使用@ Tjorriemorrie的答案提供的設置時,它才適用於應用程序/模型*(因此不適用於模塊)。 – levivanzele 2011-04-10 08:07:42

+0

您必須正確地做其他事情,因爲這實際上是實現此目的的正確方法。 – 2011-04-10 19:44:38

+0

你能舉一個你的班級名稱的例子嗎?例如。你上面例子中的賬戶模型應該被命名爲Foo_Model_Account - 這是否符合你的要求? – 2011-04-11 00:37:48

0

我也總是這樣。但由於1.10(胡亂猜測)的發佈,你可以刪除引導代碼,只是把下面一行在你的application.ini:

appnamespace = "Foo" 

我個人離開礦井空。

+0

這使它適用於全球應用程序/模型*,但它不加載任何模塊特定的模型。 – levivanzele 2011-04-10 08:12:00

+0

@ lefke123好吧,加 'resources.frontController.moduleDirectory = APPLICATION「/ modules」''和'resources.module [] =「」' – Tjorriemorrie 2011-04-11 10:51:34

+0

我已經有了這些行,這就是爲什麼它很奇怪這個問題如此持久。不管怎麼說,還是要謝謝你! – levivanzele 2011-04-11 17:47:45