131

阅读 Kohana 的文档,我发现 3.0 版本的主要区别在于它遵循 HMVC 模式,而不是像 2.x 版本那样遵循 MVC。Kohana 的文档中关于此的页面和维基百科上的页面并没有真正给我一个明确的想法。

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

4

5 回答 5

86

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

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

于 2010-03-01T13:14:12.770 回答
58

我目前正在开发自己的名为Alloy的 PHP 5.3 HMVC 框架。由于我对 HMVC 进行了大量投资和推销,我想我可以提供一个不同的观点,也许可以更好地解释为什么应该使用 HMVC 以及它带来的好处。

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

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

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

因此,虽然Sam de Freyssinet 的 TechPortal 文章中关于使用 HMVC 进行横向扩展的思考很有趣,但 90% 以上的使用 HMVC 框架的人并不会从中获得真正、实用的日常收益。

于 2011-04-20T20:21:37.113 回答
7

HMVC 与“基于组件”的调度方法密切相关。基本上,每个控制器都可以充当自己的调度程序,而不是拥有一个委托给控制器的调度程序。这为您提供了控制器的层次结构。设计更灵活,代码封装更好,但代价是更高的抽象。Konstrukt就是围绕这种模式设计的。

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

于 2010-02-15T10:43:56.553 回答
7

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

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

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

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

于 2010-07-05T22:33:36.507 回答
5

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

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

详细说明请点击这里

新链接是这个地址

于 2011-06-07T09:39:41.387 回答