2010-02-15 65 views
124

阅读Kohana的文档,我发现3.0版本的主要区别在于它遵循HMVC模式而不是2.x版本的MVC模式。 Kohana的文档和维基百科的文章并没有给我一个清晰的想法。什么是HMVC模式?

所以问题:什么是HMVC模式,它与MVC有什么不同?

+30

Kohana论坛内就这个话题进行了讨论。你可能会发现它是有帮助的:http://forum.kohanaframework.org/discussion/1681 – Sampson 2010-02-15 00:27:13

+2

@乔纳森不是一个答案,不是评论......? – 2010-02-15 00:31:32

+1

@乔纳森只是,你知道,我无法赞成它。 – 2010-02-15 00:33:00

回答

84

萨姆去弗雷西(的Kohana的开发者之一)写了一个相当in-depth article about HMVC,它是什么,以及如何使用。

Link是死:新干线 - https://web.archive.org/web/20160214073806/http://techportal.inviqa.com/2010/02/22/scaling-web-applications-with-hmvc/

+0

感谢您提供了一个很好的链接,同时结帐这个http://www.javaworld.com/jw-07-2000/jw-0721-hmvc.html – 2013-05-01 17:30:05

+2

链接已经死了 – Sithu 2017-03-03 09:34:24

+0

@Sithu https://web.archive.org/web/20160220044633/http://techportal.inviqa.com/2010/02/22/scaling-web-applications-with-hmvc – 2017-03-21 19:58:10

7

在Kohana中,至少一个HMVC的要求是服务“内部” HTTP请求:而不是发行在网络上,它的路由,出动并由框架本身处理。名称“HMVC”和“MVC”的相似性令人困惑,因为它暗示了事实上并不存在的术语之间的基础连接:一个不是另一个的小变体或修饰,它们是完全不同的事物。 (HMVC也被描述为没有客户端HTTP请求的Ajax。)Kohana强调并支持“HMVC”意味着该框架对基于HTTP的面向服务架构的强大支持。

这种架构模式的优点是,由于内部和外部请求使用了相同的“调用约定”,所以在需要时将“内部”服务请求转换为“外部”请求或反之亦然。

虽然这是一个明智的架构模式,但给它起自己的名字似乎没有必要(Symfony2描述了相同的概念“sub-requests”),事实上这个名称似乎是一个误称:没有特别的要求或需要请求形成一个层次结构(除每个命令式程序的标准调用图之外);例如,请求很容易递归。

[更新2011年4月,2012年3月:响应意见上扩展的答案。]

+2

能够将“内部”对'外部'请求的服务请求,如果需要,您可以更容易地向外扩展,即将一些应用程序模块移动到它们自己的服务器上。 – 2011-01-27 23:12:45

+1

是的,尝试实现一个内部的Web服务,没有它,只是为了看看它实际上“并不重要”。 – Kemo 2011-04-23 09:52:12

+0

@Kemo我认为这是一个很好的建筑,我只是觉得这个名字很混乱,这意味着Kohana做的事情特别不寻常。 – mjs 2011-04-24 17:45:00

56

我目前在开发自己的PHP 5.3 HMVC框架调用Alloy的过程。由于我大量投资并在HMVC上销售,我认为我可以提供一个不同的观点,也许更好地解释为什么应该使用HMVC及其带来的好处。

使用HMVC架构的最大实际好处是内容结构的“widgetization”。一个示例可能是评论,评分,Twitter或博客RSS源显示,或显示电子商务网站的购物车内容。它本质上是一段内容,需要跨多个页面显示,甚至可能在不同的地方显示,具体取决于主HTTP请求的上下文。

传统的MVC框架通常不会为这些类型的内容结构提供直接的答案,因此人们通常最终会使用自定义帮助程序,创建自己的窗口小部件结构或库文件或拉入不相关的数据来重复和切换布局从主要请求的控制器推到视图并呈现局部。这些都不是特别好的选择,因为渲染特定内容或加载所需数据的责任最终会泄漏到多个区域并在使用它的地方复制。

HMVC或者特别是向子控制器分派子请求以处理这些责任的能力是显而易见的解决方案。如果您考虑自己在做什么,它就完全适合Controller结构。您需要加载一些关于评论的数据,并以HTML格式显示它们。因此,您使用一些参数向评论控制器发送请求,与模型交互,选择视图,视图显示内容。唯一的区别是你希望评论以内联方式显示在用户正在查看的博客文章的下方,而不是完全独立的完整评论页面(尽管使用HMVC方法,实际上可以使用相同的控制器同时处理内部和外部请求,并“杀死俗话说“两鸟一石”。在这方面,HMVC实际上只是争取提高代码模块性,可重用性和保持更好的问题分离的天然副产品。这是HMVC的卖点。

所以虽然Sam de Freyssinet's TechPortal article与HMVC的扩展很有意思,但90%以上的使用HMVC框架的人将不会从中获得真正实用的日常好处。

+5

是的,这是我在现实世界中使用它的想法,但从这个角度来看,这个名称并不适合,因为HMVC中的H是误导性的(没有真正的层次结构)。 – 2011-04-20 21:34:37

+2

是的,你说得很好。我实际上分享了这个观点,并给了它另一个名字 - “嵌套MVC” - 我在2011年的ConfuTour上做了演示。它在Slideshare上,第20张幻灯片上:http://www.slideshare.net/vlucas/合金-hmvc-php-framework – 2011-04-20 22:23:01

+0

HMVC如何处理模块树中多次返回的需求?比如整理头部/ body/footer内容,JS/Css依赖关系和模块之间的相互关系。活动?钩?单身网页框架?结构化返回对象? – scipilot 2015-02-15 21:46:32

4

HMVC是分层模型视图控制器。在正常的MVC中,每个GUI对象都有它的MVC。但不同于HMVC,父GUI对象和子GUI对象之间没有任何关系。 在HMVC中,每个GUI对象都有权访问其子对象,并且每个子对象都可以访问其父对象。

所以在每个视图中都有一个父视图。通过它可以访问它的父视图。 对于每个控制器有一个父控制器,通过它可以将事件传递给父控制器(如果事件不是在其范围内。)

详细说明请点击here

新链接this address

+0

好的答案的标记不仅仅是一个没有其他信息或上下文的链接。请你可以花费你的回答,并总结链接文章的相关部分? – Kev 2011-06-07 16:17:30

+1

@Sanjay,你有什么理由将HMVC文章链接的目的地更改为移动gwt状态链接的目的地? – 2013-02-27 20:00:28

+0

@科赫..我没有改变链接...即使我不知道是谁改变了它....顺便说一句,我把它链接到原来的链接。 – 2013-03-04 17:40:36