2013-03-07 70 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