我有一个用Zend Framework编写的MVC应用程序,它从Oracle 10g数据库中提取数据并在表和列表中显示这些数据,并通过颜色和图表直观地丰富这些数据.没有ORM,也没有涉及创建,更新或删除,只是纯粹的阅读.数据从另一个应用程序插入.数据库中的数据建模在它们所代表的概念之后,并由DB视图访问,这些概念从各种其他表(遗留的,不能改变的)聚合这些数据,例如,
| 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   |

用户可以从View中影响列显示,排序和排序.客户端可以拒绝/允许访问列并将列内容限制为特定值.用户无法覆盖客户端设置.用户是演员,而客户端基本上只是一个过滤器,它为属于客户端的用户创建可用数据的子集.用户和客户端设置保持不变.

我目前的方法大致如下:

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完全通用;仅基于DB结构.用户肯定会喜欢这个.问题是,View必须对数据有很多了解. ViewHelpers必须知道列名以丰富数据,并且通常它们是关于Recordsets中的多个列的.它们不能是通用的,有些东西告诉我这无论如何都是麻烦.感觉就像混蛋.我无法确定原因.

任何模式,想法和意见都非常感谢.我知道这个问题有些模糊,但就像我说的那样,我无法确定是什么让我怀疑这种方法.所以我想我正在寻找以可维护的方式构建用户和客户端可定制数据库中心应用程序的任何良好实践方法.我当然不需要一个解决方案,只需要一些想法和一些链接来了解其他人如何解决这个问题,所以我可以在下一次重构时将其考虑在内.

注意
在接受答案之前,我会将问题保持开放状态.任何输入都表示赞赏.

在重新阅读你的问题几次并稍微反思之后,我相信我会这样总结一下情况:

您的“MVC”中缺少“M”.

此时,您手工制作了一个关系数据库模式,使其与您的域模型具有1:1的映射关系.这很棒,它使映射非常容易,但记录集仍然不是域类.

MVC上下文中的术语“模型”是指域模型,而不是关系模型.如果您有支持此应用程序的关系数据库,那么您需要某种映射.这并不是说你需要一个像Doctrine这样的完整ORM框架 – 虽然我发现这些工具让我的生活变得更加轻松,即使对于小型项目 – 但你需要一些东西.实际上,Zend Framework甚至详细介绍了在Quick Start中映射域模型的细节.

我认为您不需要删除TDG.抽象很好.为了让你的应用程序更加精简,我可以比较一下,进入办公楼并撕掉电话系统,理由是员工可以使用他们的手机.它们可以,但您不希望它们,就像您不希望您的视图直接在数据库中抛出SQL查询一样.它效率低,通常难以管理.

我的架构版本看起来像这样:

Request --> Controller
            | <--> sanitizes and returns Request params
            | ---> Facade (encapsulates 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
***         |      | <--> Mapping layer converts RecordSet to Domain Model
***         | <----returns Model
***         | <--> applies Model to View
***         | <--> Data-Aware ViewHelper render Model (and View)
Response <--returns rendered View

我用***标记了更改行.实际上,我唯一改变的是,它不是从外观中拾取记录集,而是拾取模型(可能是一个域类数组),并将其应用于View.

您可以在View [Helper]中使用$row [‘Status’]这样的术语,而不是$event->状态,这样可以更长久地维护更安全,更简单.那里没有列名,只是一个属性.

现在你在问题的最上面明确提到你没有任何ORM,所以我想你可能已经意识到这一点,也许只需要推动.那些令人唠叨的疑惑可能与你的想法有关:如果它不总是只读的话怎么办?如果数据模型变得更复杂怎么办?如果人们开始要求更复杂的报告怎么办?

所有这些都是你拥有域模型的原因,为什么它实际上是MVC的基本构建块:最终,用户拥有的心智模型将与数据模型不同步,原因有多种,我不会进入这里.关键是,它几乎总是发生.

我确定这是必要的吗?我是否肯定这不仅仅是矫枉过正,一堆仪式咒语对于这么小的项目毫无意义?

不,我不是.只有你可以决定.我可以告诉你的是,如果没有合适的域模型,作为特定架构的MVC范例对你没有多大帮助.它有点好,但没有比在每个页面中使用内联查询或外观调用更好.没有模型,MVC只不过是一个花哨的URL重写方案.

也许你需要这种抽象层次,也许你不需要;但我猜你可能怀疑你可能,否则你不会问这个问题.考虑一下,分析当前的需求和范围,问问自己可能会发生什么样的变化,如果当前的体系结构看起来太脆弱而无法适应,那么下一个逻辑步骤将是域模型 – 即使今天它只是一个确切的关系模型的镜像.明天它可能不会.

希望这是你正在寻找的那种答案!

php – 你会如何为这个应用程序建模?的更多相关文章

  1. HTML5 播放 RTSP 视频的实例代码

    目前大多数网络摄像头都是通过 RTSP 协议传输视频流的,但是 HTML 并不标准支持 RTSP 流。本文重点给大家介绍HTML5 播放 RTSP 视频的实例代码,需要的朋友参考下吧

  2. 利用Node实现HTML5离线存储的方法

    这篇文章主要介绍了利用Node实现HTML5离线存储的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. 详解如何通过H5(浏览器/WebView/其他)唤起本地app

    这篇文章主要介绍了详解如何通过H5(浏览器/WebView/其他)唤起本地app的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. H5混合开发app如何升级的方法

    本篇文章主要介绍了H5混合开发app如何升级的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. AmazeUI 折叠面板的实现代码

    这篇文章主要介绍了AmazeUI 折叠面板的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码

    这篇文章主要介绍了HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  7. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  8. html5唤起app的方法

    这篇文章主要介绍了html5唤起app的方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. HTML5拍照和摄像机功能实战详解

    这篇文章主要介绍了HTML5拍照和摄像机功能实战详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部