【问题标题】:Mapping between Model, View and Controller in PHP MVC implementationPHP MVC实现中模型、视图和控制器之间的映射
【发布时间】:2013-11-23 05:23:18
【问题描述】:

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

问题:

  • 真的有必要在模型、视图和控制器之间进行 1:1:1 映射吗?

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

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

提前谢谢你。示例将不胜感激。


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

这显然不适用于大型项目。应该如何处理路由以支持路由到多个模型(DataMapper)、多个视图,而不创建过于复杂的路由器或添加复杂的依赖注入层?

示例:如上所述,在显示博客条目时,您会显示 博客条目代码和评论部分。为了实现这一点,它 与两个 DataMapper 通信,一个获取博客条目, 以及为博客返回 cmets 的那个。怎么可能景色 被分配与这两个数据映射器一起工作以从中获取数据 数据库?

【问题讨论】:

  • 不,在 MVC 部分之间进行 1:1:1 映射实际上是错误的,因为这些“部分”甚至不在同一个“权重组”中。模型是一个层,而控制器和视图是类。并且多个控制器可以从同一页面访问,但我不知道您所说的“坐标”是什么意思。
  • MVC 中 1:1:1 映射的路由很简单,因为您可以强制 MVC 组件的位置和命名,并且当对主页的请求出现时,它会自动查找以下类: HomeView HomeController 和 HomeModel。当视图与多个模型(DataMappers)通信时如何处理路由,而不添加复杂的依赖注入层?
  • 示例:如上所述,在显示博客条目时,您会显示博客条目代码和评论部分。为此,它与两个 DataMapper 通信,一个获取博客条目,另一个返回博客的 cmets。如何分配视图与这两个数据映射器一起工作以从数据库中获取数据?
  • @Constantin,添加您的 cmets 作为答案。
  • @crafter 为什么要告诉某人将他的附加问题添加为答案?!?!

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


【解决方案1】:

不需要模型、控制器和视图的 1:1 映射。

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

假设您处理数据,然后将它们交给某人存储。您不关心他们将数据存储在哪里以及如何存储数据,只要在您需要时再次提供信息即可。您可以愉快地处理您的数据,然后对他们说“这是客户 X 的项目数据,存储它”,然后说“你能给我客户 X 的项目数据吗”。

SO MVC 采用这种方法,数据存储人员是否将所有数据一起转储或打包对您而言并不重要。但是,重要的是发送和检索时双方之间的接口。例如,您可以决定将信息存储为 Client 数据或 Project 数据,或两者兼有。

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

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

【讨论】:

  • 这听起来很合理。但是,我在 Web 上看到的大多数 PHP MVC 实现都使用页面方法来组织它们的 MVC。例如。对于主页,您有一个视图、一个控制器和一个模型。这显然不适用于大型项目。应该如何处理路由(在 1:1:1 映射中很容易,因为它使用页面名称来查找 HomeModel、HomeController 和 HomeView)以支持路由到多个模型、多个视图,而无需创建过于复杂的路由器?
  • 正确观察。我建议使用基于业务对象的方法。这通常由数据表(例如 Order)表示。但是,它应该是您的控制器的基础。问问自己“允许哪些业务功能”。对此的答案将形成控制器操作(添加、删除、打印、搜索等),并指示视图(例如订单页面)和模型(例如订单、订单商品、产品)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
相关资源
最近更新 更多