1

我对服务、实体和存储库以及我应该在哪里放置我正在从事的项目的内容感到有些困惑。我想我错过了一些东西,我担心我会以错误的方式去做。我不认为原则映射表名称非常适合报告,因为有很多列,并且这些列通常是其他 groupby 在日期、月份、年份等上的结果。

项目的简要简化概述是基于 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

销售杂志

类来运行销售日记帐并从大表导出到另一个表。

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

每周转换包

// 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.

所以当我开始这个项目时,我假设所有的函数都属于实体类。但是我不确定它们是严格的模型,因为它们需要数据库访问和对其他类的访问?困惑在哪里放置类/方法。任何反馈将不胜感激。

4

2 回答 2

2
  1. 假设您在这里使用 Doctrine。

  2. 实体中不应该有查询。它们保存数据,也许还有一些业务逻辑。所以把它们从你的名单上划掉。

  3. 通常,存储库是放置查询的地方。所以从 runSalesJournalQuery 开始

  4. generateConversions 可能属于服务。我猜它必须在坚持它的结果之前做一堆处理。

  5. 获取的东西可以放在存储库或服务中。如果它主要是一个查询,那么从存储库中开始。如果它主要处理查询的结果,那么服务可能会更好。

另请记住,您实际上只能拥有一个存储库。跨多个服务分发内容可能会使您的代码更易于管理。

于 2013-03-07T13:31:51.640 回答
2

当您谈论运行销售日志并将其从一个大表导出到另一个表时,我认为您的意思是让不同Services的人做一些小事并共同完成这项大任务。

假设您需要这样的结构:

  • ExportSalesJournalService- 这需要依赖于Repository可以访问数据库的类。可以SalesJournalRepository使用一些自定义方法来运行自定义查询。

  • ImportSalesJournalService- 这也需要与另一个相同的依赖项。

  • RunSalesJournalService- 不管你是什么意思running the sales journal。如果它需要数据库,请通过依赖Repository. 如果没有,只是一个纯粹的老式 PHP 类来完成一些任务。

请记住尽可能多地尝试解耦事物,这样您就可以拥有独立的对象。这对可维护性、可测试性和其他方面也有好处。

另一件要考虑的事情是你真的不需要遵循默认的 Symfony 标准应用程序结构,就像我在这篇文章中提到的那样。这将为您提供更低耦合的架构。

Entities也是代表某些东西的纯 PHP 类。在大多数情况下,它们应该是愚蠢的对象。永远不要,永远不要将业务特定代码或数据库访问权限放入其中。

对于转换生成,自定义Service可能也是要走的路。有名字的东西ConversionGenerationService或与之相近的东西。

Remeber to provide the intent of the object in its class name. This is really important.

Concerning the reports, I would probably create a Service to generate them, based on specific Repositories. Remember to resolve the dependencies explicity, through the constructor or setters.

于 2013-03-07T13:40:13.627 回答