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

PHP MVC实现中模型、视图和控制器之间的映射,php,model-view-controller,content-management-system,datamapper,Php,Model View Controller,Content Management System,Datamapper,概述:我正在使用PHP构建CMS,并尝试使用MVC实现它。我正在尝试使用扩展我的代码,因为它代表了MVC的精确表示,而且非常简单。为了与数据库通信,我使用域对象和数据映射器 问题: 模型、视图和控制器之间真的需要1:1:1的映射吗 示例:对于博客系统,在显示博客条目页面时,我将创建一个名为DisplayEntryController的控制器和一个名为DisplayEntryView的视图。视图将从BlogMapper类(与DB通信以检索当前博客条目)和CommentMapper类(与DB通信

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

问题:

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

  • 多个控制器可以处理一个页面吗?对于上面的示例,是否可以让DisplayEntryController和CommentController处理显示博客条目的页面的相关部分?如果是,两个控制器将如何协调
先谢谢你。我们将不胜感激



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

这在大型项目中显然不起作用。如何处理路由以支持路由到多个模型(数据映射器)、多个视图,而不创建过度复杂的路由器或添加复杂的依赖注入层


示例:如上所述,当显示您显示的博客条目时 博客条目代码和评论部分。为了实现这一点,它 与两个数据映射器通信,一个获取博客条目, 还有一个是返回博客评论的。你怎么能看到这个景色 被指派使用这两个数据映射器从中获取数据 DB


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

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

假设您处理数据,然后将它们交给某人存储。您不在乎他们将数据存储在何处以及如何存储数据,只要您需要时信息仍然可用。你可以很高兴地开始处理你的数据,然后对他们说,例如‘这是客户X的项目数据,请保存’,然后说‘你能给我客户X的项目数据吗?’

因此,MVC采用这种方法,数据存储人员是将所有数据一起转储还是打包对您来说并不重要。但是,重要的是发送和检索时双方之间的接口。例如,您可以决定将信息存储为客户机数据或项目数据,或两者都存储

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


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

不,在MVC部件之间使用1:1:1映射实际上是错误的,因为这些“部件”甚至不在同一个“重量组”中。模型是一个层,而控制器和视图是类。可以从同一页面访问多个控制器,但我不知道“坐标”是什么意思。MVC中1:1:1映射的路由非常简单,因为您可以强制执行MVC组件的位置和命名,当请求主页时,它会自动查找以下类:HomeView HomeController和HomeModel。当视图与多个模型(数据映射器)通信时,如何处理路由,而不添加复杂的依赖项注入层?示例:如上所述,显示博客条目时,显示博客条目代码和注释部分。为了实现这一点,它与两个数据映射器通信,一个获取博客条目,另一个返回博客评论。如何将视图分配给这两个数据映射器以从数据库中获取数据?@Constantin,添加您的评论作为答案。@crafter为什么要告诉某人添加其他问题作为答案?!?!听起来很合理。然而,我在web上看到的大多数PHP MVC实现都使用页面方法来组织它们的MVC。例如,对于主页,您有一个视图、一个控制器和一个模型。这在大型项目中显然不起作用。如何处理路由(在1:1:1映射中,使用页面名称查找HomeModel HomeController和HomeView很容易)以支持到多个模型、多个视图的路由,而不创建过于复杂的路由器?观察正确。我建议使用基于业务对象的方法。这通常由数据表(例如订单)表示。但是,它应该是控制器的基础。问问自己“允许哪些业务功能”。对此的回答将形成控制器操作(添加、删除、打印、搜索等)