我正在使用Zend Framework的完整MVC功能编写Web应用程序,并包括服务层,域模型和映射器。我认为我对各层的理解是正确的,但我想确认一下。
上层取决于下面的层,所以从顶部开始:
控制器 - 最顶层。高度依赖于View,它实例化,填充和渲染。取决于访问模型的服务。
查看 - 不知道控制器。偶尔依赖于服务或模型,例如填充选择控件的查找列表。
服务 - 为客户端提供API,例如Controller。高度依赖于模型。实际上,服务通常在模型的Mapper和Domain部分之间进行调解,以便为客户完成工作。
Mapper(模型,A部分) - 熟悉Domain,操作Domain对象以适应关系数据存储,并操纵关系数据以创建新的Domain对象。
域模型(模型,B部分) - 包含域逻辑。域对象不知道其他层,但由于它们需要访问其他域对象,因此它们可以作为“对象查找器”访问映射器。
这听起来是对的吗?我错过了什么?
答案 0 :(得分:3)
好。在一些细节中,它有点像 wrong-ish 。
MVC中有两个主要层:
控制器 “最顶层”。它们是表示层的一部分,它们的职责是处理用户的请求并传递提取的信息以改变模型层的状态(通过服务)和(更罕见的)当前视图。
我想说,服务是Model的“C部分”。此外,我更喜欢名称“域对象”而不是“域模型”或“模型对象”,因为它会导致额外的混淆。
域对象无法访问数据映射器。域对象本身应完全不知道它们是否存储。该部分由服务处理。您可以在this answer中找到code / api示例。
答案 1 :(得分:1)
基本上,我同意你的陈述,但我会更深入。
控制器是View和模型之间的中介。正如你所说,View不知道控制器,但Model也是如此。
此外,正如您所提到的,在您的模型中,将服务层作为模型的入口点也是一个好点!
您必须始终保持控制器和视图层可能位于服务器上,而模型位于另一个服务器上。因此,您的服务充当您的业务需求和业务逻辑之间的界面。它还可以处理您的交易,错误标准化等......实际上是横向事物。
对于您的域名部分,我会将您的映射器部分分为两个不同的部分。由于它是您的DAL,您可能想要创建类:
我的意思是,你的BL会向你的DAL请求一个对象,所以你要求你的存储空间给你。存储有一组检索器,例如level1缓存(常规php数组),level2缓存(memcached,redis,任何东西),最后是你的数据库。所以我在DAL中基本上有2个子层:一个存储类及其堆栈的存储和优先级,以及这些存储中的fetch实现。
不要忘记仅使用工厂进入图层,以便通过模拟其中的对象或在每个图层之间添加拦截器来更轻松地进行单元测试。
问候。
答案 2 :(得分:0)
你忘了MVC的'M',那是Model。 模型提供了您的视图,呈现它所需的信息,或您希望客户端提交的信息。 Controller和View通过您的模型交换信息。 但一个重要的细节是模型不是你的Domail模型