Was ist das HMVC-Muster?


130

Beim Lesen der Dokumentation von Kohana stellte ich fest, dass der Hauptunterschied in der Version 3.0 darin besteht, dass sie dem HMVC-Muster anstelle von MVC folgt, wie dies in Version 2.x der Fall ist. Die Seite darüber in Kohanas Dokumenten und die auf Wikipedia gab mir keine klare Vorstellung.

Frage: Was ist das HMVC-Muster und wie unterscheidet es sich von MVC?


30
Eine Diskussion zu diesem Thema fand in den Kohana-Foren statt. Sie können es als hilfreich erachten
Sampson

Antworten:


86

Sam de Freyssinet (einer der Kohana-Entwickler) schrieb einen ziemlich ausführlichen Artikel über HMVC , was es ist und wie es verwendet werden kann.

Link ist tot: Neuer Link - https://web.archive.org/web/20160214073806/http://techportal.inviqa.com/2010/02/22/scaling-web-applications-with-hmvc/




Links werden immer sterben! poste Inhalt statt Link.
Loki

58

Ich bin gerade dabei, mein eigenes PHP 5.3 HMVC-Framework namens Alloy zu entwickeln . Da ich stark in HMVC investiert und dort verkauft bin, dachte ich, ich könnte einen anderen Standpunkt vertreten und vielleicht eine bessere Erklärung dafür, warum HMVC verwendet werden sollte und welche Vorteile es bringt.

Der größte praktische Vorteil der Verwendung einer HMVC-Architektur ist die "Widgetisierung" von Inhaltsstrukturen. Ein Beispiel können Kommentare, Bewertungen, RSS-Feed-Anzeigen von Twitter oder Blogs oder die Anzeige von Warenkorbinhalten für eine E-Commerce-Website sein. Es handelt sich im Wesentlichen um einen Inhalt, der auf mehreren Seiten und möglicherweise sogar an verschiedenen Stellen angezeigt werden muss, abhängig vom Kontext der Haupt-HTTP-Anforderung.

Herkömmliche MVC-Frameworks bieten im Allgemeinen keine direkte Antwort auf diese Art von Inhaltsstrukturen. Daher duplizieren und wechseln Benutzer im Allgemeinen Layouts, verwenden benutzerdefinierte Helfer, erstellen ihre eigenen Widget-Strukturen oder Bibliotheksdateien oder ziehen nicht verwandte Daten aus den angeforderten Hauptdaten Controller zum Durchschieben in die Ansicht und zum teilweisen Rendern. Keine dieser Optionen ist besonders gut geeignet, da die Verantwortung für das Rendern eines bestimmten Inhalts oder das Laden der erforderlichen Daten in mehrere Bereiche gelangt und an den verwendeten Stellen dupliziert wird.

HMVC oder insbesondere die Möglichkeit, Unteranforderungen an einen Controller zu senden, um diese Verantwortlichkeiten zu erfüllen, ist die offensichtliche Lösung. Wenn Sie darüber nachdenken, was Sie tun, passt es genau zur Controller-Struktur. Sie müssen einige Daten zu Kommentaren laden und im HTML-Format anzeigen. Sie senden also eine Anfrage mit einigen Parametern an den Kommentar-Controller, dieser interagiert mit dem Modell, wählt eine Ansicht aus und die Ansicht zeigt den Inhalt an. Der einzige Unterschied besteht darin, dass die Kommentare inline angezeigt werden sollen, und zwar unterhalb des Blog-Artikels, den der Benutzer anstelle einer vollständig separaten vollständigen Kommentarseite anzeigt (obwohl Sie mit einem HMVC-Ansatz sowohl interne als auch externe Anforderungen mit demselben Controller und "kill" bearbeiten können zwei Fliegen mit einer Klappe ", wie das Sprichwort sagt). In dieser Hinsicht HMVC ist eigentlich nur ein natürliches Nebenprodukt des Strebens nach mehr Codemodularität, Wiederverwendbarkeit und einer besseren Trennung von Bedenken. Dies ist das Verkaufsargument von HMVC.

Während der TechPortal-Artikel von Sam de Freyssinet über die Skalierung mit HMVC interessant ist, werden nicht 90% der Menschen, die HMVC-Frameworks verwenden, echte, praktische und alltägliche Vorteile daraus ziehen.


5
Ja, so habe ich es mir in der realen Welt vorgestellt, aber unter diesem Gesichtspunkt passt der Name nicht ganz, da das H in HMVC irreführend ist (es gibt keine reale Hierarchie).
Matteo Riva

2
Ja, Sie machen einen guten Punkt. Ich teile diesen Standpunkt tatsächlich und gebe ihm einen anderen Namen - "Nested MVC" - in einer Präsentation, die ich bei Confoy 2011 auf Alloy gemacht habe. Es ist auf Slideshare, Folie Nr. 20: slidehare.net/vlucas/alloy-hmvc-php- Rahmen
Vance Lucas

Wie würde HMVC mit der Notwendigkeit mehrerer Rückgaben aus dem Modulbaum umgehen? ZB Zusammenstellung von Kopf- / Körper- / Fußzeileninhalten, JS / Css-Abhängigkeiten und Wechselbeziehungen zwischen Modulen. Veranstaltungen? Haken? Ein Singleton-Seiten-Framework? Strukturierte Rückgabeobjekte?
Scipilot

1
Diese Antwort ist eine Kopie von Wikipedia: / en.wikipedia.org/wiki/…
EricG

3
@EricG sieht so aus, als hätte jemand die Antwort, die ich hier gegeben habe, kopiert und dann zu Wikipedia hinzugefügt (ich war es nicht). Überprüfen Sie den Abschnitt "Referenzen" am Ende des Wikipedia-Artikels - er verweist auf diesen Kommentar.
Vance Lucas

7

HMVC ist eng mit dem "komponentenbasierten" Versandansatz verbunden. Grundsätzlich kann jeder Controller anstelle eines einzelnen Dispatchers, der an einen Controller delegiert, selbst als Dispatcher fungieren. Dies gibt Ihnen eine Hierarchie von Controllern. Das Design ist flexibler und bewirkt eine bessere Kapselung von Code, jedoch zu einem Preis höherer Abstraktion. Konstrukt ist nach diesem Muster gestaltet.

Siehe auch diese Antwort: /programming/115629/simplest-php-routing-framework/120411#120411


7

Zumindest in Kohana ist eine HMVC-Anforderung eine HTTP-Anforderung, die "intern" bearbeitet wird: Anstatt über das Netzwerk ausgegeben zu werden, wird sie vom Framework selbst weitergeleitet, versendet und verarbeitet. Die Ähnlichkeit der Namen "HMVC" und "MVC" ist insofern verwirrend, als sie einen zugrunde liegenden Zusammenhang zwischen den Begriffen nahe legt, der tatsächlich nicht existiert: einer ist keine geringfügige Variante oder Modifikation des anderen, es handelt sich um völlig andere Dinge. (HMVC wird auch als Ajax ohne clientseitige HTTP-Anforderung bezeichnet.) Kohanas Betonung auf und Unterstützung für "HMVC" bedeutet, dass das Framework eine HTTP-basierte serviceorientierte Architektur stark unterstützt.

Der Vorteil dieses Architekturmusters besteht darin, dass es für interne und externe Anforderungen trivial ist, "interne" Dienstanforderungen in "externe" Anforderungen umzuwandeln oder umgekehrt, da die gleiche "Aufrufkonvention" für interne und externe Anforderungen verwendet wird.

Obwohl dies ein vernünftiges Architekturmuster ist, erscheint es unnötig, ihm einen eigenen Namen zu geben (Symfony2 beschreibt dasselbe Konzept " Unteranforderungen "), und tatsächlich scheint der Name eine falsche Bezeichnung zu sein: Es gibt keine besondere Anforderung oder Notwendigkeit, dass die Anforderungen eine bilden Hierarchie (außer dem Standardaufrufdiagramm jedes imperativen Programms); Die Anforderungen können beispielsweise leicht rekursiv sein.

[ Update April 2011, März 2012: Erweitert auf Antwort als Antwort auf Kommentare.]


2
Wenn Sie "interne" Serviceanfragen in "externe" Anforderungsmenüs konvertieren können, können Sie diese bei Bedarf einfacher skalieren, dh einige Anwendungsmodule auf ihren eigenen Server verschieben.
Kim Prince

1
Ja, versuchen Sie, einen internen Webdienst damit und ohne ihn zu implementieren, um zu sehen, ob er tatsächlich "nicht wirklich so wichtig ist".
Kemo

@Kemo Ich denke, es ist eine schöne Architektur, ich denke nur, der Name ist verwirrend und es impliziert, dass Kohana etwas besonders Ungewöhnliches tut.
mjs

Ich bin mir nicht sicher, wie Ihre Antwort hilfreich ist. Sie beantworten die Frage nicht, indem Sie sich nur über den Namen beschweren und dass dies unnötig ist (was in Ordnung ist).
Dave

4

HMVC ist Hierarchical Model View Controller. In normaler MVC hat jedes GUI-Objekt seine MVC. Im Gegensatz zu HMVC besteht jedoch keine Beziehung zwischen dem übergeordneten GUI-Objekt und dem untergeordneten GUI-Objekt. In HMVC hat jedes GUI-Objekt Zugriff auf seine untergeordneten Objekte und jedes untergeordnete Objekt kann auf sein übergeordnetes Objekt zugreifen.

In jeder Ansicht gibt es also eine übergeordnete Ansicht. Über diese kann auf die übergeordnete Ansicht zugegriffen werden. Denn in jedem Controller gibt es einen übergeordneten Controller, über den das Ereignis an den übergeordneten Controller übergeben werden kann (wenn das Ereignis nicht in seinem Gültigkeitsbereich liegt).

Für eine detaillierte Beschreibung klicken Sie bitte hier

Neuer Link ist diese Adresse


1
Das Zeichen einer guten Antwort ist nicht nur ein Link ohne andere Informationen oder Zusammenhänge. Können Sie bitte Ihre Antwort ausgeben und den relevanten Teil des verlinkten Beitrags zusammenfassen?
Kev

1
@ Sanjay, aus irgendeinem Grund haben Sie das Ziel des Links vom HMVC-Artikel in eines über den Status von gwt für Handys geändert?
Brad Koch

@ Koch..Ich habe den Link nicht geändert ... auch ich weiß nicht, wer ihn geändert hat .... übrigens habe ich ihn mit dem ursprünglichen Link verknüpft.
Sanjay Jain
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.