HMVC模式是什么?


130

阅读Kohana的文档,我发现3.0版本的主要区别在于它遵循HMVC模式,而不是像2.x版本那样遵循MVC模式。Kohana的文档中有关此内容的页面以及Wikipedia上的页面并未真正给我一个清晰的主意。

那么问题来了:HMVC模式是什么,它与MVC有何不同?


30
在Kohana论坛中就此主题进行了讨论。您可能会发现有帮助:forum.kohanaframework.org/discussion/1681
Sampson

Answers:


86

Samana Freyssinet(Kohana开发人员之一)写了一篇关于HMVC的相当深入的文章,它是什么以及如何使用它。

链接已死:新链接-https://web.archive.org/web/20160214073806/http: //techportal.inviqa.com/2010/02/22/scaling-web-applications-with-hmvc/


感谢您的良好链接,也请查看此javaworld.com/jw-07-2000/jw-0721-hmvc.html
Owais Qureshi


链接永远会死!发布内容而不是链接。
洛基,

58

我目前正在开发自己的名为Alloy的PHP 5.3 HMVC框架。由于我在HMVC上进行了大量投资并出售,因此我想我可以提供不同的观点,也许可以更好地解释为什么应使用HMVC及其带来的好处。

使用HMVC架构的最大实际好处是内容结构的“小部件化”。例如注释,等级,Twitter或博客RSS feed显示或电子商务网站的购物车内容显示。本质上,这是一条内容,需要根据主HTTP请求的上下文在多个页面上显示,甚至可能在不同的位置显示。

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

HMVC,或者特别是将子请求分派给Controller来处理这些职责的能力是显而易见的解决方案。如果您考虑自己在做什么,它将完全适合Controller结构。您需要加载有关注释的一些数据,并以HTML格式显示它们。因此,您将带有一些参数的请求发送到注释Controller,它与Model交互,选择一个View,然后View显示内容。唯一的不同是您希望注释以嵌入式方式显示,用户正在查看的博客文章下方,而不是一个完全独立的完整注释页面(尽管使用HMVC方法,您实际上可以使用相同的控制器来处理内部和外部请求,并且“俗话说:“两只鸟和一块石头”。在这方面,HMVC实际上只是努力提高代码模块化,可重用性以及保持更好的关注点分离的自然产物。这是HMVC的卖点。

因此,尽管Sam de Freyssinet关于HMVC扩展的TechPortal文章值得思考,但并不是90%以上的使用HMVC框架的人都能从中获得实际的,实用的,每天的收益。


5
是的,这就是我在现实世界中使用它的方式,但是从这个角度来看,这个名称不太合适,因为HMVC中的H会误导您(没有真实的层次结构)。
Matteo Riva

2
是的,你说的很对。我实际上同意这种观点,并在我在Confoo 2011大会上对Alloy所做的演示中给它起了另一个名字-“嵌套的MVC”。它位于Slideshare,幻灯片#20:slideshare.net/vlucas/alloy-hmvc-php-框架
万斯·卢卡斯

HMVC将如何处理模块树中的多次收益需求?例如,整理头部/身体/页脚内容,JS / Css依赖关系以及模块之间的相互关系。活动?钩子?单例页面框架?结构化返回对象?
scipilot 2015年

1
这个答案是维基百科的副本:/ en.wikipedia.org/wiki/...
EricG

3
@EricG好像有人复制了我在这里给出的答案,然后将其添加到Wikipedia(不是我)。检查Wikipedia文章底部的“参考”部分-它链接回到此评论。
万斯·卢卡斯2015年


7

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

这种架构模式的优势在于,由于内部和外部请求使用相同的“调用约定”,因此在需要时将“内部”服务请求转换为“外部”请求很简单,反之亦然。

尽管这是一种明智的体系结构模式,但为其赋予自己的名称似乎是不必要的(Symfony2描述了相同的概念“ sub-requests ”),实际上,该名称似乎是用词不当:没有特别的要求或要求这些请求构成一个层次结构(每个命令性程序的标准调用图除外);例如,请求可以很容易地进行递归。

[ 2011年4月更新,2012年3月:根据评论扩展了答案。]


2
能够将“内部”服务请求转换为“外部”请求,因此您可以根据需要更轻松地进行横向扩展,即将某些应用程序模块移至其自己的服务器上。
金亲王

1
是的,尝试使用它或不使用它来实现内部Web服务,只是看它是否实际上“没什么大不了”。
Kemo

@Kemo我认为这是一个很好的体系结构,我只是觉得它的名称令人困惑,这意味着Kohana在做一些特别不寻常的事情。
mjs 2011年

我不确定您的答案有什么帮助。您不是在抱怨这个名称,而是回答它是不必要的(这很好),而不是回答这个问题。
戴夫

4

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

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

详情请点击这里

新链接是这个地址


1
好的答案的标志不仅仅是没有其他信息或上下文的链接。请您扩展您的答案并总结链接文章的相关部分吗?
凯夫

1
@Sanjay,您是否出于某种原因将链接的目的地从HMVC文章更改为gwt for mobile的状态?
Brad Koch

@Koch ..我没有更改链接...即使我也不知道是谁更改了.... btw,我将其链接到原始链接。
Sanjay Jain
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.