2012-11-14 482 views
2

我正在研究一個Zend Framework(1.11)應用程序,我將其移植到模塊中,以便開發人員可以插入和播放各種對我們軟件的添加並輕鬆刪除。Zend框架模塊庫

我有(和似乎沒有能夠找到一個答案是)我有可靠的庫代碼,也就是我的結構是目前這個

- application 
    - (the standard ZF stuff) 
    - modules 
    - testModule 
     - Bootstrap.php 
     - controllers 
     - configs 
     - views 
- library 
    - CoreStuff 
     - Class.php 
     - SpecialClass.php 
    - testModuleLibrary 
     - Class.php 
     - SpecialClass.php 

而且我真正想要的問題這是爲了讓其他開發者更容易將模塊安裝到我們的系統中。

- application 
    - (the standard ZF stuff) 
    - modules 
     - testModule 
     - Bootstrap.php 
     - controllers 
     - configs 
     - views 
     - library 
      - Class.php 
      - SpecialClass.php 
- library 
    - CoreStuff 
     - Class.php 
     - SpecialClass.php 

我可以在模塊Bootstrap中使用Autoloader嗎?還是必須將其添加到我的包含路徑?

[編輯]

這是我當前模塊的引導,我又看到了這個代碼的時間和時間與我的谷歌搜索危機四伏,但它似乎沒有任何區別

<?php 

    class Notifications_Bootstrap extends Zend_Application_Module_Bootstrap { 

     protected function _initLibraryAutoloader() { 
      return $this->getResourceLoader()->addResourceType('library', 'library', 'library'); 
     } 

} 
+0

有點難說,因爲ZF1沒有模塊的想法。我在使用的testModule中看到的Bootstrap.php如何? – Jojo

+0

目前它並沒有做任何事情,因爲所有Zend想要知道它在那裏,但如果我可以讓Zend知道我的模塊中有另一個庫,那將是一個非常理想的情況。 –

回答

1

我已使用以下代碼解決了我的問題。我真的不知道爲什麼我沒有想出這個早期:(:(

class Notifications_Bootstrap extends Zend_Application_Module_Bootstrap { 
    protected function _initConfig() { 
     set_include_path(implode(PATH_SEPARATOR, array(
      dirname(__FILE__) . '/library', 
      get_include_path(), 
     ))); 
    } 
} 
0

你可能只是使用模塊的Boostrap.php。 提供功能

protected function _initAutoload(){} 

使lib可用。因此,您可以讓模塊開發人員這樣做,因爲它是開發模塊以使其資源可加載的工作的一部分:)

+0

並稱SNIPPIT似乎沒有任何區別我也沒有加入 「返回新Zend_Loader_Autoloader_Resource(陣列( ‘命名空間’=>‘通知’, ‘基本路徑’=> MODULE_DIR。‘/通知’, 「 (' ) ) ));「數組'( ) );」 因爲它的功能體? –

1

您可以像應用程序的配置文件定義庫的路徑: 這是例如陽明

project: 
    bootstrap: 
     path: APPLICATION_PATH/Bootstrap/index.php 
     class: Bootstrap_Index 
    Autoloadernamespaces: 
     - Zend_ 
     - Library1_ 
     - Library2_ 
    resources: 
     FrontController: 
      moduledirectory: 
       - APPLICATION_PATH/modules 
...... 

這裏是例如INI格式

[bootstrap] 
     Autoloadernamespaces[] = "Zend_" 
     Autoloadernamespaces[] = "Library1_" 
     Autoloadernamespaces[] = "Library2_" 

     resources.FrontController.moduleDirectory = APPLICATION_PATH"/modules" 
     resources.FrontController.resetRouterOnEveryRequest = true 

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

關於項目的目錄結構,我建議你使用類似的東西:

- application 
    - Bootstrap 
     - index.php 
    - Modules 
     - Mod1 
      - controllers 
      - views 
     - Mod2 
      - controllers 
      - views 
     ... 
- library 
    - Zend 
     - ... 
    - Library1 
     - ... 
    - Library2 
     - ... 

做完,你可以有類似的URL /目錄結構:模塊/:控制器/:動作,並保持所有的第三方代碼單獨在自己的游泳池圖書館目錄

+0

我並不是真的希望開發人員編輯任何核心,他們的想法是開發一個模塊,並且可以有效地發揮作用。我的回答是我已經解決的問題,開發人員可以完成包含他們自己的庫的工作。 –

+1

如果你遵循你的結構,你可能會得到 - Module1(Lib1,Lib2) - Module2(Lib1,Lib3),所以你將開始複製所需的庫。在我的方法中,您有1個庫池,您可以在其中轉儲所有正在使用它所需的第三方代碼和模塊目錄。你的開發者沒有改變任何核心,他們所要做的就是創建像APP_DIR/module/MyModule /這樣的模塊,並且這些模塊會被路由器自動映射,所以你可以有URL:/:module /:controller /:action和voila! – infinity

+1

我週二回去工作時會回顧一下,它確實有道理,我可能只是偏執狂。感謝您的建議;將回報。 –

0

我加入這個迴應既希望回答原來的問題,並對此處提交的一些項目提供一些說明。我是ZF 1.11中一個活躍的模塊開發人員,並且使用我將要在我們維護的幾個模塊之一中每天解釋的內容。

對於此回覆的長度,我很抱歉。有幾個項目需要考慮和考慮。

一,實施。

以下提供的片段據我所知提供〜1.8,並不會是你想要的1.11。

<?php 

class Notifications_Bootstrap extends Zend_Application_Module_Bootstrap { 

    protected function _initLibraryAutoloader() { 
     return $this->getResourceLoader()->addResourceType('library', 'library', 'library'); 
    } 

} 

下,雖然將工作提供優良下面我會介紹幾個關鍵要素。

protected function _initLibraryAutoloader() { 
    return $this->getResourceLoader()->addResourceType('library', 'library', 'Library_'); 
} 

您會注意到第三個參數(名稱空間)略有差異。這樣做的最好的解釋將是可能更新的功能如下:

Array 
(
[dbtable] => Array 
    (
     [namespace] => Admin_Model_DbTable 
     [path] => /path/to/trunk/application/modules/admin/models/DbTable 
    ) 

[mappers] => Array 
    (
     [namespace] => Admin_Model_Mapper 
     [path] => /path/to/trunk/application/modules/admin/models/mappers 
    ) 

[form] => Array 
    (
     [namespace] => Admin_Form 
     [path] => /path/to/trunk/application/modules/admin/forms 
    ) 

[model] => Array 
    (
     [namespace] => Admin_Model 
     [path] => /path/to/trunk/application/modules/admin/models 
    ) 

[plugin] => Array 
    (
     [namespace] => Admin_Plugin 
     [path] => /path/to/trunk/application/modules/admin/plugins 
    ) 

[service] => Array 
    (
     [namespace] => Admin_Service 
     [path] => /path/to/trunk/application/modules/admin/services 
    ) 

[viewhelper] => Array 
    (
     [namespace] => Admin_View_Helper 
     [path] => /path/to/trunk/application/modules/admin/views/helpers 
    ) 

[viewfilter] => Array 
    (
     [namespace] => Admin_View_Filter 
     [path] => /path/to/trunk/application/modules/admin/views/filters 
    ) 

[library] => Array 
    (
     [namespace] => Admin_Library 
     [path] => /path/to/trunk/application/modules/admin/library 
    ) 

) 

如果你比較這對以前的「庫」爲:

protected function _initLibraryAutoloader() { 
    $this->getResourceLoader()->addResourceType('library', 'library', 'Library_'); 
    var_dump($this->getResourceLoader()->getResourceTypes());die; 
} 

輸出應該是類似的東西第三個參數,你會在第二個參數中看到它爲什麼會產生如此重要的差異。

重申,在這一點上,您已經聲明瞭一個庫類型,其前綴爲「Library_」,即翻譯爲「Admin_Library」。現在,爲了實現這一點,您可以像在主應用程序模塊中一樣在模塊中創建庫文件夾,只需稍作調整即可。要擁有管理員模塊特定的控制器操作(Admin_Library_Controller_Action),您將擁有庫/ Controller/Action.php,並且類名稱爲Admin_Library_Controller_Action。這是大多數人開始感到困惑的地方,但它與您應該在模塊中使用的其他資源命名空間非常相似。

總結技術說明。如果您沒有進一步閱讀,您將能夠擁有一個特定於您的模塊的庫,並且完全獨立,可以輕鬆複製/粘貼可重複使用模塊。

現在對於我在這裏看到的其他一些回覆的一些評論。

無窮指出

「如果你按照你的結構,你可能最終與 - 單詞數(LIB1,LIB3),所以你會開始複製需要的庫 - 模塊1(LIB1,LIB2)。」

這在技術上是正確的,但如果您發現自己經常使用同一個庫,那麼在您的實際開發風格中會帶來更多問題。我們通常將這些常用項存儲在另一個庫中,我們將它們用作外部的,與Zend相同,並放在Zend的一側放在主應用程序庫文件夾中。

假如你已經這樣做了,我相信可能需要一些額外的說明,如果你正確地使用了命名空間,你絕對不必擔心庫類名的衝突。你可能會在很短的時間內發現你需要在多個模塊中擁有相同代碼的類,但是一旦發生這種情況,除了上面提到的Zend之外,還應該考慮一下通用庫。

我對此回覆的長度再次表示歉意。我希望它能幫助任何可能遇到這篇文章的人需要模塊中的庫實現。