2012-08-08 65 views
8

我想通過使用Zend Framework 2來處理一個小項目。我經歷過各種博客文章,文檔,當然還有Akrabat(羅布艾倫)的精彩教程。什麼是Zend Framework 2模塊的正確或首選的目錄結構?

但是,在我所有的閱讀中,我還沒有遇到任何關於Zend Framework 2期望的模塊的正確或首選目錄結構的解釋。

Akrabat tutorial Rob Allen的示例模塊中使用了一個模型和控制器。他選擇的目錄結構爲:

/module 
    /Album 
     /config 
     /src 
      /Album 
       /Controller 
       /Form 
       /Model 
     /view 
      /album 
       /album 

這是所有罰款,但如果一個模塊有多個控制器和模型,你希望在一個網站,有多個頁面/板塊?我會將所有控制器放在/ src/Album/Controller目錄中,還是爲每個附加模型和相關控制器和視圖創建另一組/ src/xxx /目錄?

在/ view目錄中,是否將它分解爲各個控制器使用的每個視圖集的子目錄?

我認爲我的困惑來自於Rob的例子中他的主控制器/模型與模塊名稱相同。所以他的專輯模塊有一個目錄,更多專輯模型,控制器和視圖的目錄。如果我是從命名其模塊專輯,比方說,MyModule的將目錄結構則變爲:

/module 
    /MyModule 
     /config 
     /src 
      /Album 
       /Controller 
       /Form 
       /Model 
     /view 
      /MyModule 
       /album 

難道然後按照一個額外的模型,藝術家,以及相關的控制器將這樣組織:

/module 
    /MyModule 
     /config 
     /src 
      /Album 
       /Controller 
       /Form 
       /Model 
      /Artist 
       /Controller 
       /Form 
       /Model 
     /view 
      /MyModule 
       /album 
       /artist 

如果不是以上,那麼它是什麼結構?

這當然都假設ZF2期望一個嚴格的結構。如果情況並非如此,那麼顯然我可以按照我想要的方式組織它。

回答

14

要快速回答您的最終問題 - ZF2確實不關心目錄結構。或者我應該說 - 它沒有預定義的結構。這就是它具有自動加載器配置和類映射的原因(取決於您選擇使用哪種方法)。

「默認」自動加載磁帶機(見Module.php),你可以在大多數例子中找到僅假定您的模塊名類都將在./src/ModuleName目錄中找到:

// ./modules/ModuleName/Module.php 
public function getAutoloaderConfig() 
{ 
    return array(
     'Zend\Loader\StandardAutoloader' => array(
      'namespaces' => array(
       __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
      ), 
     ), 
    ); 
} 

我假定你知道這就是那些__NAMESPACE__部件的意思。

因此,如果您有一個名爲Cat的模塊,它的類將預計在./modules/Cat/src/Cat中找到。

如果您決定在應用程序中添加一些新功能,則可以添加另一個名爲Dog的模塊,並將其類文件放在./Dog/src/Dog中。

但是,這絕不意味着你必須這樣做。您還可以將所有與動物有關的課程放在一個名爲例如Animals。你將不得不修改磁帶自動加載機看起來像這樣:

// ./modules/Animals/Module.php 
public function getAutoloaderConfig() 
{ 
    return array(
     'Zend\Loader\StandardAutoloader' => array(
      'namespaces' => array(
       'Cat' => __DIR__ . '/src/Cat', 
       'Dog' => __DIR__ . '/src/Dog', 
      ), 
     ), 
    ); 
} 

...和類放在文件,如./modules/Animal/src/Cat/Persian.php./modules/Animal/src/Dog/Collie.php

我會建議的一件事情是,將模塊視爲不知道任何特定於其他模塊的單獨實體。作爲一個「真實生活」的例子 - 我有一個應用程序,它有一個前端(html,css等)和一個API功能。

我有3個模塊:

  • Application - 包含數據庫CONFIGS,db表類,映射器,型號,認證類等,基本上任何其他模塊可能需要的一切。
  • Api - 控制器期待特定格式的請求並將其輸出爲例如。 JSON(即不需要視圖)。這個模塊中的類使用了Application模塊中的類,因爲我仍然需要所有的數據庫功能,但是將它們全部分開後,可以將應用程序範圍的邏輯從API邏輯中分離出來。我可以將這個模塊翻出來,而不會破壞其他任何東西。
  • Website - 模塊僅負責渲染頁面。再次,它使用類從應用程序,我希望能夠呈現數據庫中的數據,並允許用戶編輯它,但我並不在此模塊中想要的功能僅作爲API需要它。

./config/application.config.php加載它們按以下順序:

return array(
    'modules' => array(
     'Application', 
     'Api', 
     'Website', 
    ), 
    // all other entries 
); 

這意味着我必須從所有其它模塊訪問應用程序類。如果由於某種原因想要禁用我的API,我只需要移除Api目錄,我的前端仍然可以工作。

希望這會有所幫助! :)

TL; DR 您可以構建文件,你想要的任何方式,只是不要忘了正確配置磁帶自動加載。