PHP MVC实现中模型,视图和控制器之间的映射

时间:2013-11-23 05:23:18

标签: php model-view-controller content-management-system datamapper

概述:我正在使用PHP构建CMS,我正在尝试使用MVC实现它。我正在尝试使用this structure扩展我的代码,因为它代表了MVC的准确表示,而且非常简单。要与我的数据库通信,我使用域对象和数据映射器。

问题:

  • 是否真的有必要在模型,视图和控制器之间建立1:1:1的映射?
  

示例:对于博客系统,当显示博客条目页面时,我将创建一个名为DisplayEntryController的控制器,以及一个名为DisplayEntryView的视图。该视图将从BlogMapper类(与DB通信以检索当前博客条目)和CommentMapper类(与DB通信以检索当前博客条目的注释)获取其信息。考虑到视图适用于2个模型对象,这是一个好习惯吗?如果不是什么替代方案?如果是,如何以通用方式实施?

  • 多个控制器可以处理一个页面吗?对于上面的示例,是否可以使用DisplayEntryController和CommentController处理显示博客条目的页面的相关部分?如果是,2个控制器将如何协调?

提前谢谢你。将非常感谢例子。


我在网上看到的大多数PHP MVC实现都使用页面方法来组织他们的MVC。例如。对于主页,您有一个视图,一个控制器和一个模型。在MVC中进行1:1:1映射的路由非常简单,因为您可以强制执行MVC组件的位置和命名,并且当主页的请求出现时,它会自动查找以下类:HomeView HomeController和HomeModel。

这在大型项目中显然效果不佳。如何处理路由以支持路由到多个模型(DataMappers),多个视图,而无需创建过于复杂的路由器或添加复杂的依赖注入层?

  

示例:如上所述,显示您显示的博客条目时   博客条目代码和评论部分。要实现这一点,它   与两个DataMappers通信,获取博客条目,   以及返回博客评论的那个。怎么看   被指派使用这两个数据处理器来获取数据   DB?

1 个答案:

答案 0 :(得分:2)

不需要对模型,控制器和视图进行1:1映射。

MVC采用分层方法处理应用程序的概念,每个层由“代理”处理,以实现他们认为合适的方式。要进一步解释这一点,请考虑以下情况。

假设您处理数据,然后将其交给某人存储。只要信息在您需要时再次可用,您无需关心它们存储的位置以及它们存储数据的方式。您可以愉快地处理数据,然后对他们说“这是客户端X的项目数据,存储它”,然后说“你能给我客户X的项目数据吗。”

无论数据存储人员将所有数据转储到一起还是打包它们对你来说并不重要,那么MVC就可以采用这种方法。但是,重要的是双方在发送和检索时的接口。例如,您可以决定将信息存储为客户端数据或项目数据,或两者兼而有之。

同样,您可以让代理收集数据并将其处理给您进行处理。您不关心他们使用多少接口(例如,电话,网络,电子邮件,移动设备),但您关心他们向您提供的数据。 (当然,规则可能规定只能处理网络信息)。因此,收集数据的接口可能不同。

因此,每个代理都可以使用最有效的方法(甚至将它们组合或拆分)以使系统在他们身边工作,因此没有数据映射。