最近,我和我的一位同事就以下问题进行了辩论:
我声称通过Zend的ViewHelper直接加载一个模型并不是MVC明智和良好的实践,因为它是一个与视图相关的东西,它应该通过严格的接受来调用另一个控制器。
我的同事声称相反,ViewHelper在呈现存在于.phtml文件中的视图之前被调用,因此它可以调用所需的任何模型和/或服务。
所以我想知道谁声称最符合MVC-理智的声明。
请记住,引发这场争论的问题在于我们开发的web应用程序;我们需要显示HTML的可重用组件,这些组件被当作小部件处理,并通过Ajax呈现它们将减缓整个站点的速度。
发布于 2017-03-10 22:21:35
在原始MVC模型中,控制器与视图和模型交互。视图由更改模型通知,并可以访问模型内容以查看:
对于任何给定的模型,都有一个或多个视图,每个视图都能够在屏幕和硬拷贝上显示模型的一个或多个图形表示。视图还能够在与该视图合理关联的模型上执行此类操作。 - Trygve,MVC的发明者
将数据加载到模型中不是一种显示操作。这是内存中模型数据的一个变化。这应该由控制器触发,而不是由视图触发。顺便说一句,大多数MVC变体,例如MVP,都应用了类似的逻辑(例如,视图只显示而从不更改模型)。
然而,根据Zend的手册,MVC的似乎有自己的理解:
视图-视图准确地定义了呈现给用户的内容。通常,控制器将数据传递给每个视图以某种格式呈现。视图也经常从用户那里收集数据。在这里,您可能会在MVC应用程序中找到HTML标记。
在真正的MVC中,视图从不收集数据。
结论:你完全正确!尽管如此,在Zend哲学中并没有使用纯MVC,所以您的同事可能不会完全错误。
发布于 2017-03-11 05:55:49
在您的视图脚本中,经常需要一遍又一遍地执行某些复杂的功能:例如格式化日期、生成表单元素或显示操作链接。您可以使用助手类为您执行这些行为。zend:查看助手
除其他外,这告诉我们视图助手不是视图。它是视图使用的实用程序。
通过Zend的ViewHelper直接加载一个模型并不是MVC明智和良好的实践,因为它是一个与视图相关的东西,它应该通过严格的接受来调用另一个控制器。
该模型包含数据。其中一些数据需要显示在视图中。因此,声称这只是为了“查看相关的东西”并不能给你一个很好的明确的切断。
我所知道的反对这一观点的最佳理由是,视图不应该对模型进行投票。如果视图等待被告知是时候更新和显示什么,那就更好了。视图不应该知道或关心是否是模型告诉它这一点。这种智慧不是来自MVC。它来自告诉你,别问。
ViewHelper在呈现存在于.phtml文件中的视图之前被调用,因此它可以调用所需的任何模型和/或服务。
这使得ViewHelper听起来像一个控制器。如果这是真的,那就没事了。但这不是视图所使用的实用程序应该做的事情。如果是这样的话,他们应该关注提供视图、显示正确接收的数据所需的行为。zend文档似乎就是这么说的。
MVC是一个非常古老的设计模式。MVC实现的唯一一致之处在于三个方面的责任。其他的一切:区域之间的交流,依赖,控制的流动,都在空中。告诉我你在使用MVC并不能告诉我多少。理智与否。
https://softwareengineering.stackexchange.com/questions/343898
复制相似问题