MVC:应该直接查看与模型的对话吗?

cli*_*i__ 15 php model-view-controller

早些时候,许多开发人员认为视图不应该像大多数框架那样直接与模型通信.

然后,这个意见似乎是错误的,我找到了一些文章,这些文章说视图可以直接与模型沟通.

http://r.je/views-are-not-templates.html
http://www.tonymarston.net/php-mysql/model-view-controller.html
模型,视图,控制器混淆
以及
模型应该如何在MVC中构建?

大多数这些文章引用了维基百科,模型 - 视图 - 控制器的块,引号是:

视图查询模型以生成适当的用户界面(例如视图列出购物车的内容).视图从模型中获取自己的数据.在一些实现中,控制器可以向视图发出一般指令以呈现其自身.在其他情况下,视图会自动通知需要屏幕更新的状态(Observer)更改模型.

啊,这是来自维基百科,这样一个权威的网站,一定是对的!

但现在,当我打开MVC http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller的wiki链接时,该页面已于今年9月14日(今年)进行了编辑2013),上面的句子已经消失了.

视图的新定义是:

视图通过控制器从模型请求向用户生成输出表示所需的信息.

现在我又困惑了,新的定义说视图应该通过控制器从模型中请求数据......

视图应该直接在地球上访问模型吗?

ter*_*ško 21

以下是经典MVC架构中的依赖关系的表示.您会注意到没有箭头从控制器指向视图,因为它是新增的:

在此输入图像描述
Source: GUI architectures

然后有一个依赖关系图更接近你将在"MVC框架"中看到的内容:

被动视图
Source: Passive view

"被动视图"配置不是 MVC架构的一部分.虽然它使用相同的名称,但实际上它是MVP模式的变体(您可以在本出版物中找到更长更详细的描述)

结论:是的,如果您正在实现MVC或类似MVC的架构,那么您的视图应该是从模型层请求信息.

此外,您应该注意到这不是所谓的"mvc框架"所推动的.在类似Rails的框架中,没有视图.相反(因为原始结构是为原型制作的),视图被替换为哑模板,视图的所有职责被推入他们称之为"控制器"的东西.

基本上,恕我直言,命名类似Rails模式的最佳方式是OLT:ORM-Logic-Template.

  • 维基百科不是一些单一的知识来源.所有的变化都没有人.而有些人是愚蠢的. (2认同)

dec*_*eze 13

"模型"是您的核心应用程序.您的应用程序可以执行的所有操作都在模型中.
"视图"用于可视化正在发生的事情并提供用户界面.
"控制器"是对事件做出反应并指示模型并查看要做什么所需的粘合剂.

现在,您对模型和视图之间的通信有哪些选择?

  1. 推送:通常由控制器将视图所需的所有数据推入其中.
  2. 拉:视图从它自己需要的地方获取所需的所有数据.

第二个显然更加独立.如果您需要将数据推送到视图中,则意味着视图外的某个人需要知道视图所需的内容.尤其是视图可以非常动态并且经常变化.有人决定在右上角再显示一个小部件,突然之间视图需要更多数据.这意味着需要重新编码其他部分以将更多数据推送到视图中.因此,您需要更改至少两个独立的部分,因为视图已被更改.

更好的选择是为视图提供一个句柄,使其能够与模型通信并获取它自己需要的所有数据.控制器只是告诉视图"我们现在需要XYZ形式,这里是一个与模型对话的句柄,去吧!" 并且视图可以完成其工作.

  • @deceze您的语句_控制器只是告诉视图“我们现在需要表格XYZ,这是与模型对话的句柄,快走!” _。我从没想过控制器将模型的句柄传递给视图。您加深了我对MVC的理解!谢谢! (2认同)