代码之家  ›  专栏  ›  技术社区  ›  Matteo Riva

什么是HMVC模式?

  •  128
  • Matteo Riva  · 技术社区  · 15 年前

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

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

    5 回复  |  直到 7 年前
        1
  •  86
  •   Damith Ruwan    7 年前

    SamdeFreyssinet(Kohana开发者之一)写了一篇 in-depth article about HMVC ,它是什么,以及如何使用它。

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

        2
  •  58
  •   Shog9    11 年前

    我目前正在开发自己的php 5.3hmvc框架 Alloy . 由于我在HMVC上投入了大量资金并进行了大量销售,我认为我可以提供一个不同的观点,或许可以更好地解释为什么应该使用HMVC及其带来的好处。

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

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

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

    所以当 Sam de Freyssinet's TechPortal article 在使用hmvc进行扩展时,有意思的是,使用hmvc框架的90%以上的人不会从中获得真正的、实际的、日常的好处。

        3
  •  7
  •   Community Fabien Hure    7 年前

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

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

        4
  •  7
  •   mjs    12 年前

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

    这种体系结构模式的优点是,由于相同的“调用约定”用于内部和外部请求,因此在需要时将“内部”服务请求转换为“外部”请求或将其转换为“外部”请求是很简单的。

    虽然这是一个合理的体系结构模式,但给它起自己的名字似乎是不必要的(symfony2描述了相同的概念) sub-requests “”,事实上,该名称似乎用错了名称:请求构成一个层次结构(而不是每个命令程序的标准调用图)没有特殊的要求或需求;例如,请求可以很容易地递归。

    [ 更新日期:2011年4月、2012年3月: 对回答进行了扩展,以回应评论。]

        5
  •  4
  •   Geek Num 88 Walter    11 年前

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

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

    有关详细说明,请单击 here

    新链接是 this address