【问题标题】:Looking for some OOAD advice for Reporting寻找一些关于报告的 OOAD 建议
【发布时间】:2009-09-22 16:06:28
【问题描述】:

我需要以多种不同的文件格式创建任意数量的报告。我可以使用 Smarty 模板输出的大多数格式。但是,输出到 Excel 和 PDF 会比较复杂,需要使用 FPDF 或 TCPDF 和 PHPExcel。

我正在尝试找出通过一种或多种设计模式(如果可能)来组织课程的最佳方式。

输出格式:

  • 文字 - Smarty
  • 文本(带 PCL 格式)- Smarty
  • CSV - Smarty
  • HTML - Smarty
  • Excel - PHPExcel
  • PDF - FPDF/TCPDF

这些格式需要能够在内存中进行流式传输或写入文件以供以后使用。

所有报告唯一一致的是它们需要数据,直到添加 PDF 和 Excel 支持,一个模板。目前我有一个 Report 类,它有一个名为 getData() 的抽象方法。每个子类(例如 SpecificReport)获取它需要的数据并将其存储在类属性中以绑定到模板等。

每份报告都需要以所有格式提供。

Report 类目前处理输出,但添加对 Excel 和 PDF 的支持使这变得不可能。除了像 Smarty 那样将数据绑定到模板之外,还有很多其他功能。每个报告都需要特定的代码。我想我可以在每个报告子类中重载这些方法。

有没有人遇到过类似的任务?

【问题讨论】:

    标签: php oop inheritance design-patterns ooad


    【解决方案1】:

    听起来你可以使用Two Step View pattern

    基本上,您的报告会分两次呈现。第一遍针对您的模型执行报告逻辑以生成一种原型报告对象。第一遍原始报告包含报告中的所有信息,根据报告需要进行组织和分组。

    一旦完成,原始报告将被输入到模板中,该模板将其呈现为特定格式(pdf、xls、csv 等)。第二遍生成报告的字节,可以将其存储到文件中或通过网络发送出去。

    【讨论】:

    • 我认为这是一个很好的模式/想法。最难的部分是为 Excel 和 PDF 格式创建中间阶段。如果我想创建一个将任何模板写入 Excel 文件或流的 ExcelWriter 类型类,我基本上必须为这些标签创建一个标签方案和解释器。我认为这种模式是我最初的想法,但被我刚才提到的东西吓倒了。也许我只是想让它更容易。 =)
    • 不要使用标签方案和解释器。使您的中间报告成为对象图。然后让您的渲染器读取该对象图并将其转换为报告。
    • 在 PofEAA Fowler 中说,当屏幕之间的共性很少时(在我们的例子中是报告),这种模式不能很好地工作。这适用于这里吗?报告数据都是一样的,但是我无法想象一个中间状态(对象图),它可以用来创建完全独立的输出,而无需使用特定于该报告的代码。 proto-report 对象似乎在 PDF 和 Excel 格式之间可能存在很大差异。我真的很喜欢这个想法,我只是想弄清楚它是如何为我工作的。
    • 我想这取决于同一份报告的 PDF 和 Excel 版本之间的差异有多大,尽管有一些创造力,我认为可以做到。例如,我必须制作同一个报表的 Excel 和 Crystal Reports 版本。 Crystal 版本具有分组、标题、排序和汇总行。 Excel 版本将每个数据行的每一列都放在一个巨大的网格中,用作数据透视表的来源。从视觉上看,报告大相径庭,但在抽象意义上,它们几乎相同。
    • 我认为这绝对是值得思考和尝试的事情。我必须戴上我最好的思考帽。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 2021-11-18
    • 1970-01-01
    • 2018-10-04
    相关资源
    最近更新 更多