2013-03-07 106 views
1

我對服務,實體和存儲庫有點困惑,我應該在什麼地方放置什麼工作。我想我錯過了一些東西,我擔心我會以錯誤的方式去做。我不認爲原則映射表名稱是理想的報告,因爲有很多列和列往往是其他groupby在日期,月份等的結果。symfony2實體,存儲庫,服務混淆

項目簡要概述是一個基於Web的集合報告(作爲捆綁)。

爲了創建報告,我必須使用銷售日記帳包預先生成數據。銷售日誌從事務數據庫中提取數據,並將其放入表中,準備好由各種其他報告運行,即具有自定義索引等的數據。數據聚合是解釋它的更好方式。數據來源有幾百萬的預訂數據回去年,所以它的效率不高直接根源,使多數民衆贊成在銷售雜誌進來的基礎報告。

SalesJournalBundle  - fetches data from source and puts it into a table ready for other reports 
WeeklyConversionReportBundle - exports sales journal into weekly conversion report table has functions for totals for the week, totals for month, etc 
OtherReportBundle    - etc 

salesJournal

類運行銷售雜誌和從大表導出到另一個表。

createQuery($parameters); 
runQuery($exportTableName); 

WeeklyConversionBundle

// runs the sales journal and saves to the report. Entity? Or Service or Repoistory? 
runSalesJournalQuery(); 

// generates conversion figures and saves the to the table? Entity Or Service or Repoistory? 
generateConversions(); 


getWeekTotals();   // used when displaying the report.. 
getMonthTotals($month) // used when displaying the report.. 
getTotals()    // used when displaying the report.. 
etc. 

所以,當我開始這個項目我認爲所有的功能在實體類屬於..但林不知道他們是嚴格的模型,因爲他們需要數據庫訪問和訪問其他類?混淆類/方法的放置位置。任何反饋將不勝感激。

回答

2

當你談論運行銷售日誌,並從一個大表導出到另一個表,我想你指的是具有不同Services該做的小事,共同完成這項艱鉅的任務。

比方說,你需要這樣的結構:

  • ExportSalesJournalService - 這將需要對訪問數據庫中的Repository類的依賴。它可能是一個SalesJournalRepository與一些自定義方法來運行自定義查詢。

  • ImportSalesJournalService - 這將需要相同的依賴另一種爲好。

  • RunSalesJournalService - 不管你用running the sales journal意思。如果它需要數據庫,請解決此問題,並依賴於Repository。如果沒有,只是一個純粹的舊時尚PHP類,可以完成一些任務。

記住嘗試和解耦最多的東西,所以你可以有獨立的對象。這對於可維護性,可測試性以及其他方面都很有用。其他

有一點要考慮的是,你真的不需要遵循默認的Symfony標準應用程序的結構,就像我在this post提。這將爲您提供更低的耦合架構。

Entities是,還純潔和樸實的PHP類代表東西。在大多數情況下,它們應該是愚蠢的物體。絕對不要將業務特定的代碼或數據庫訪問權限放入其中。

對於轉換生成,自定義Service也許是順其自然的方法。一些名爲ConversionGenerationService或任何與之相近的東西。

記住在其類名中提供該對象的意圖。這非常重要。

關於報告,我可能會根據具體的Repositories創建一個Service來生成它們。記住通過構造函數或setter來解決依賴關係的問題。

+0

感謝您的回覆。我認爲關鍵字運行有幫助。銷售日誌查詢的運行必須是服務。當你擴展倉庫時,這意味着你必須使用doctrine sql嗎? – 2013-03-07 14:30:39

+0

存儲庫是由教條提供的用於管理查詢的類。您可以通過添加自定義方法來擴展它。 – 2013-03-07 14:34:52

+0

如何將依賴項添加到服務中以便我可以運行查詢? – 2013-03-07 14:53:30

2
  1. 假設你在這裏使用Doctrine。

  2. 實體不應該在其中有查詢。他們掌握數據,也許還有一些業務邏輯。所以把它們從你的列表中刪除。

  3. 通常,存儲庫是放置查詢的地方。因此,從runSalesJournalQuery開始

  4. generateConversions可能屬於服務。我猜它必須在保持結果之前做一堆處理。

  5. 獲取的東西可以放在存儲庫或服務中。如果它主要是一個查詢,那麼從存儲庫開始。如果它主要處理查詢的結果,那麼服務可能會更好。

還請記住,你真的只能有一個存儲庫。在多個服務之間分發內容可能會使您的代碼更易於管理。

+0

實體應該真的不持有商業邏輯。他們被認爲是愚蠢的對象來存儲數據和表示一些東西。業務邏輯應該是[域模型]內部發生(http://martinfowler.com/eaaCatalog/domainModel.html)或[服務層](http://martinfowler.com/eaaCatalog/serviceLayer.html)。 – 2013-03-07 13:42:07

+1

這可能很容易退化成這些宗教戰爭之一的薄皮衣。恕我直言實體可以並經常承擔業務邏輯。但這個問題並沒有真正的相關性。我們都似乎同意數據庫查詢不應該出現在實體中。 – Cerad 2013-03-07 13:55:50

+0

我使用原則,但對於一些使用原始數據庫的查詢,只是因爲查詢很大。將非主義查詢放入存儲庫是否是一種好的做法? – 2013-03-07 14:26:39