【发布时间】:2011-01-13 01:59:04
【问题描述】:
我有一个用 Zend Framework 编写的 MVC 应用程序,它从 Oracle 10g 数据库中提取数据并在表格和列表中显示这些数据,并通过颜色和图表直观地丰富这些数据。不涉及 ORM,也不涉及创建、更新或删除,只是纯粹的阅读。数据是从另一个应用程序插入的。数据库中的数据是根据它们所代表的概念建模的,并由数据库视图访问,这些数据视图从各种其他表(旧的,无法更改)聚合这些数据,例如
| Event ID | Start | End | Status | Created_By |
-----------------------------------------------------------------------------
| 12345678 | 2009-10-01 12:00:00 | 2009-10-01 12:15:00 | booked | John Doe |
| 12345679 | 2009-11-01 13:00:00 | 2009-12-01 12:00:00 | booked | John Doe |
| 12345680 | 2009-11-01 13:00:00 | 2009-12-01 12:00:00 | tba | Jane Doe |
用户可以从视图影响列的显示、排序和排序。客户端可以拒绝/允许访问列并将列内容限制为某些值。用户不能覆盖客户端设置。用户是一个参与者,而客户端基本上只是一个过滤器,它为属于客户端的用户创建可用数据的子集。用户和客户端设置保持不变。
我目前的做法大致是这样的:
Request --> Controller
| <--> sanitizes and returns Request params
| ---> Facade (capsules steps to fetch View Data)
| | <--> Table Data Gateway builds Query for requested View
| | <--> Query Decorator¹ applies User/Client settings
| | <--> DB Adapter fetches RecordSet from decorated Query
| <----returns Recordset
| <--> applies RecordSet to View
| <--> Data-Aware ViewHelper render RecordSet (and View)
Response <--returns rendered View
¹ 查询装饰器可以读取持久的用户/客户端设置并将其添加到 TDG 动态返回的基本查询对象中。
但是,最近我一直怀疑这种方法并希望对其进行改进。我想我可以完全删除 TDG 并使视图构建从 UI 完全通用;仅基于数据库结构。用户肯定会喜欢这个。问题是,视图必须对数据了解很多。 ViewHelper 必须知道列名才能丰富数据,而且他们通常会针对 Recordsets 中的多个列这样做。它们不能是通用的,有些东西告诉我这无论如何都是麻烦的。感觉就像杂烩。我只是无法确定原因。
非常感谢任何模式、想法和意见。我知道这个问题有些模糊,但就像我说的,我无法确定是什么让我怀疑这种方法。所以我想我正在寻找任何好的实践方法来以可维护的方式构建用户和客户端可定制的以数据库为中心的应用程序。我当然不需要解决方案,只需要一些想法,也许还有一些链接来看看其他人是如何解决这个问题的,所以我可以在下一次重构时考虑它。
注意
在接受答案之前,我会在整个过程中保持问题开放。任何意见表示赞赏。
【问题讨论】:
-
请原谅我的怀疑,但是:视图需要对数据了解很多? ViewHelpers 必须知道列名? 为什么? 这听起来像是一种内部平台效应,是 Microsoft Access 或 Cognos 的再发明。超出一定门槛的定制是邪恶的;可能是需要重构的需求。
-
@Aaronaught 怀疑主义很好。这就是让我问这个问题的原因 :) 回答你的问题:想象有一个 ViewHelper,它根据 Start、End 和 Status呈现时间轴栏> 作为呈现整个 Recordset 的表的一部分,以及基于 Created_By 呈现 PieChart 的 ViewHelper。
标签: php design-patterns oop architecture