symfony2实体,存储库,服务混淆

时间:2013-03-07 12:56:32

标签: php symfony architecture

我对服务,实体和存储库有点困惑,我应该为我正在处理的项目做些什么。我想我错过了什么,我担心我会以错误的方式去做。我不认为学说映射表名称是报告的理想选择,因为有很多列,列通常是日期,月份等的其他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

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 个答案:

答案 0 :(得分:2)

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

  2. 实体不应该在其中有查询。他们持有数据,也许还有一些业务逻辑。所以将它们从你的清单中删除。

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

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

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

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

答案 1 :(得分:2)

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

假设您需要这样的结构:

  • ExportSalesJournalService - 这需要依赖于有权访问数据库的Repository类。它可以是SalesJournalRepository,其中包含一些自定义查询的自定义方法。

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

  • RunSalesJournalService - 无论你的意思是running the sales journal。如果需要数据库,请依赖Repository来解决此问题。如果没有,只是一个纯粹的旧时尚PHP类,它可以完成一些任务。

记住尝试尽可能地分解事物,这样你就可以拥有独立的物体。这对于可维护性,可测试性和其他方面也很有用。

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

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

对于转换生成,自定义Service可能也是一种方法。名为ConversionGenerationService的东西或任何接近它的东西。

记得在其类名中提供对象的 intent 。这非常重要。

关于报告,我可能会根据具体的Service创建一个Repositories来生成它们。请记住通过构造函数或setter解析依赖关系明确性。