2012-05-18 56 views
0

我正在開發一個ZF1 + Doctrine2應用程序,它有兩個模塊:默認是默認的標準網站,'休息'是提供REST接口。很明顯,兩個模塊使用相同的模型,因爲它們共享許多常見的數據庫操作。我的架構的目標是避免從控制器調用Doctrine EM方法,在它之上創建抽象層(API的類型)以實現解耦和代碼一致性(我個人不喜歡有時調用模型,有時在控制器中構建查詢但我可能是錯的)。在幾個模塊中使用的模型。它應該放在哪裏?

我很想將模型放在庫中(/library//Users/Users.php等),但不確定這裏的庫是否合適,只是因爲模型意味着在應用程序文件夾中,它們不擴展任何ZF類。但是,圖書館是整個應用程序之間共享的,這讓我想到了它。

我想出了另一種選擇是把它放在應用程序/模塊/默認/模型,但如果我這樣做,它在邏輯上與其他模塊分開,儘管這些模型是全球性的。

哪種解決方案是在這種情況下更好還是有什麼其他的方式,我沒有提到做正確嗎?

+0

模塊應該是100 %「自給自足」或模塊化。意思是,它應該只需要庫和你定義的任何自定義類。我們的目標是能夠將一個模塊從應用程序移植到應用程序,比如「插件」,所以我不認爲在默認應用程序和模塊中具有相同的模型是「非幹」的。乾杯 – mpm

回答

2

我試着保留我的庫文件夾以用於跨項目的東西,這是一種供我放入的庫的供應商文件夾,可以直接使用或在我自己的類中使用(根據需要添加autoloadernamespaces條目)。

在一個多模塊應用程序中,我保留了跨模塊的東西 - 像常見的模型,映射器,視圖助手和將由所有模塊使用的部分腳本 - 在應用程序級別,使用appnamespace命名(Application_或者My_或者其他的東西)。然後,我推送所有模塊 - 包括默認模塊! - 進入modules文件夾。模塊特定的東西 - 如控制器,表單,視圖 - 然後用模塊名稱命名空間。喜歡的東西:

/application 
    /configs 
     application.ini 
    /layouts 
    /models # app-level! 
    /modules 
     /admin 
      /controllers 
      /forms 
      /models 
      /views 
       /helpers 
       /scripts 
     /front 
      /controllers 
      /forms 
      /models 
      /views 
       /helpers 
       /scripts 
    /views # app-level! 
     /helpers 
     /scripts  
/data 
    /cache 
/library 
    /App 
    /Zend 
/public 
    index.php 
    /assets 
     /css 
     /img 
     /js 
/scripts 

通常情況下,模塊自舉類 - 延長Zend_Application_Module_Boostrap - 註冊正確的自動加載磁帶機資源映射使對象實例化一個微風。

一個說明:由於我喜歡我的控制器使用它們所在的模塊名稱空間,我需要設置一個PARAM上FrontController設計使他意識到:

resources.frontController.params.prefixDefaultModule = true 

TL:DR:

  • 跨項目類駐留在library並使用它們自己的lib命名空間。
  • 應用層次,跨模塊類駐留在應用層次,採用appnamespace
  • 模塊級類駐留在模塊文件夾,並使用在我看來模塊命名空間
1

ZF 1.x的是不是真的模塊化的,我認爲在ZF 1.x的模塊是一個有點用詞不當。在我看來,它們更像域名庫。這就是說, 我看着這樣的代碼分離(純粹的意見)。

  • 任何代碼,我希望在我放入庫的另一個項目中重用或可重用。例如。查看幫助者,動作助手,抽象模型類,基礎模型,插件等...

  • 任何特定於應用程序的代碼,將在我放入應用程序級目錄的應用程序中普遍使用。這是像具體的數據映射器,DbTable模型(我不使用Doctrine),形式和佈局的東西...

  • 任何代碼,特別是屬於一個模塊(域),不會或不能在其他地方使用我把模塊級別的目錄。這包括諸如特殊視圖和動作助手之類的東西,其中一種形式,並且大部分是我放置我的域(實體)模型的地方。

爲了說明這一點,我將介紹一個例子(個人命名空間略):

我有一個名爲音樂在我的應用模塊,該模塊有一個名爲「音樂」數據庫表
所以這些是我可能必須在我的模塊中使用此Db表的文件。

//The DbTable model 
application 
    /models 
     /DbTable 
      /Music.php //extends Zend_Db_Table_Abstract 

要使用DBTABLE模式,我建立使用2檔

//Base mapper class 
library 
    /Application 
     /Model 
      /Mapper.php 
//The concrete mapper 
application 
    /modules 
     /models 
      /MusicMapper.php //extends Namespace_Application_Model_Mapper 

,並使用該映射器我本來它是由2個文件的域模型映射器,基實體類和具體的實體類。

//Base entity class 
library 
    /Application 
     /Model 
      /Entity.php 

//and the concrete entity class 
application 
    /modules 
     /models 
      /Music.php //extends Namespace_Application_Model_Entity 

我覺得以這種方式組織我的文件和類可以讓代碼儘可能幹,而不會讓人感到困惑和分散。

我希望這有助於。

相關問題