什么是HMVC模式?

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

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

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

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

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

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

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

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

所以, Sam de Freyssinet的TechPortal关于HMVC扩展的文章很有意思,但是使用HMVC框架的人中90%以上的人不会从中得到真正实用的日常好处。

HMVC与“基于组件”的调度方法密切相关。 基本上,每个控制器可以独立充当一个调度器,而不是只有一个调度器(委派给一个控制器)。 这给你一个控制器的层次结构。 devise更加灵活,可以更好地封装代码,但代价更高。 Konstrukt是围绕这种模式devise的。

另请参阅此答案: https : //stackoverflow.com/questions/115629/simplest-php-routing-framework/120411#120411

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

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

虽然这是一个明智的架构模式,但给它自己的名字似乎是不必要的(Symfony2描述了同样的概念“ 子请求 ”),事实上这个名字似乎是一个用词不当:没有特别的要求或需要,形成一个(除了每个命令式程序的标准调用图之外); 例如,请求很容易recursion。

[ 2011年4月更新,2012年3月:针对评论扩大回答。]

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

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

有关详细说明,请点击这里

新的链接是这个地址