HMVC een introductie en toepassing

Deze zelfstudie is een inleiding tot het patroon van de Hiërarchische Model View Controller (HMVC) en de manier waarop deze van toepassing is op de ontwikkeling van webtoepassingen. Voor deze zelfstudie zal ik voorbeelden van de CodeIgniter uit de Scratch-serie gebruiken en laten zien hoe HMVC een waardevolle wijziging in uw ontwikkelingsproces kan zijn. Deze inleiding gaat ervan uit dat je het Model View Controller (MVC) -patroon begrijpt. We raden aan dat je onze inleiding tot MVC leest om kennis te maken met het onderwerp voordat je deze tutorial aanpakt.

Wat is HMVC?

HMVC is een evolutie van het MVC-patroon dat momenteel voor de meeste webtoepassingen wordt gebruikt. Het kwam tot stand als een antwoord op de verkoopbaarheidsproblemen die zich voordoen in toepassingen die MVC gebruikten. De oplossing gepresenteerd in de JavaWorld-website, juli 2000, stelde voor dat de standaard Model, View en Controller-triade gelaagd worden tot een "hiërarchie van parent-child MCV-lagen". De afbeelding hieronder illustreert hoe dit werkt:

Elke triade functioneert onafhankelijk van elkaar. Een triade kan via zijn controllers toegang vragen tot een andere triade. Beide punten maken het mogelijk om de applicatie zo nodig over meerdere locaties te distribueren. Bovendien biedt de gelaagdheid van MVC-triaden een meer diepgaande en robuuste applicatie-ontwikkeling. Dit leidt tot verschillende voordelen die ons naar ons volgende punt brengen.

Waarom zou ik HMVC gebruiken??

Belangrijkste voordelen bij het implementeren van het HMVC-patroon in uw ontwikkelingscyclus:

  • modularisatie: Vermindering van afhankelijkheden tussen de verschillende delen van de applicatie.
  • Organisatie: Het hebben van een map voor elk van de relevante triaden zorgt voor een lichtere werklast.
  • herbruikbaarheid: Door de aard van het ontwerp is het gemakkelijk om bijna elk stukje code te hergebruiken.
  • uitbreidbaarheid: Maakt de applicatie meer uitbreidbaar zonder in te boeten op onderhoudsgemak.

Met deze voordelen kunt u M.O.R.E uit uw toepassing halen met minder hoofdpijn.

HMVC instellen in CodeIgniter

Om extra diepte toe te voegen aan de CodeIgniter uit Scratch-series, zullen we de voorbeelden van vandaag bekijken in CodeIgniter. Ik zal ons de weg wijzen die nodig is om CodeIgniter met HMVC te laten werken. Als we daarmee klaar zijn, zal ik een paar voorbeelden geven. Laten we beginnen!

Voorwoord

Als u webtoepassingen wilt uitvoeren, hebt u een webserver op uw computer nodig als u niet op afstand werkt. Hier zijn aanbevelingen met links naar installatie-instructies:

  • Ramen: XAMPP 1.7.3 - Installatie-instructies
  • Mac: Schakel uw "Personal Web Sharing" - Installatie-instructies in

Stap 1. Download en installeer CodeIgniter

Ga naar codeigniter.com en klik op de koppeling "Download CodeIgniter". Als u weet hoe u het moet installeren en u wilt deze stap overslaan, klik dan hier

Pak de inhoud van het zipbestand uit naar de documentroot van uw webserver.

Hernoem de "CodeIgniter_1.7.2"map naar"hmvcExample".

Verplaats de "hmvcExample / system / applicatie"map naar"hmvcExample / applicatie"Dit is gebruikelijk met CodeIgniter, het doel hiervan is om de applicatie te scheiden van de kern van het framework.We zouden nu een directory moeten hebben die er als volgt uit ziet:

Open "hmvcExample / application / config / config.php"in je editor naar keuze.

Bewerk de url van de site zodat deze overeenkomt met de locatie van uw installatie. In mijn geval zou ik veranderen

$ config ['base_url'] = "http://example.com/";

in

$ config ['base_url'] = "http: // localhost / hmvcExample /";

Sla je wijzigingen op en sluit "hmvcExample / application / config / config.php"

Test dat we een werkende versie van CodeIgniter hebben. Open uw browser en controleer uw "http: // yourhost / hmvcExample /".
U zou begroet moeten worden met het "Welcome to CodeIgniter" scherm hieronder:

Dat is het! U hebt CodeIgniter met succes gedownload en geïnstalleerd. Nu gaan we verder met het werken met de HMVC-extensie.

Stap 2. Download en installeer HMVC-extensie

Download versie 5.2 van de modulaire extensie van de CodeIgniter Wiki.

In de inhoud van het zip-bestand staan ​​drie php-bestanden:

Verplaats deze drie bestanden naar de "hmvcExample / application / libraries /"map.

Controleer je browser opnieuw. U moet nog steeds het scherm Welcome to CodeIgniter zien.

Het is tijd om de modules toe te voegen. Maak de volgende mapstructuur "application / modules / welkom / controllers /".

Verplaats de "application / controllers / welkom.php" naar "application / modules / welkom / controllers / welkom.php".

Controleer je browser opnieuw. U moet nog steeds het scherm Welcome to CodeIgniter zien.

Maak de map "application / modules / welkom / views /"

Verplaats de "application / views / welcome_message.php" naar "application / modules / welkom / views / welcome_message.php".

Voer een laatste controle uit op uw browser. U moet nog steeds het scherm Welcome to CodeIgniter zien.

Dat is het! Modular Extensions is correct geïnstalleerd.

Aanmeldmodule Voorbeeld

Nu we ons HMVC-codevoorbeeld CodeIgniter hebben, zal ik enkele korte voorbeelden demonstreren. Voor ons eerste voorbeeld laat ik zien hoe u gebruikerstoegangsbeperkingen op pagina's of volledige modules kunt toepassen.

Download en pak CodeIgniter uit Scratch Day 6 bronbestanden in uw webserver. Je zou eindigen met een map genaamd "ci_day6 /"naast onze"hmvcExample /"

Maak de "Log in"module in onze"hmvcExample / applicatie"directory. Het zou er als volgt uit moeten zien

 hmvcVoorbeeld / toepassing / modules / login / controllers / hmvcVoorbeeld / toepassing / modules / login / modellen / hmvcVoorbeeld / toepassing / modules / login / views /

Maak de "site" -module in onze map "hmvcExample / application". Het zou er als volgt uit moeten zien

 hmvcVoorbeeld / toepassing / modules / site / controllers / hmvcVoorbeeld / toepassing / modules / site / modellen / hmvcVoorbeeld / toepassing / modules / site / weergaven /

TIP: Wanneer ik met modules werk, bewaar ik een map met de naam RENAME met de drie controllers, modellen en views voor lege mappen. Dit bespaart me een beetje tijd wanneer ik een nieuw model wil maken.

Nu kopiëren we de Log in module bestanden van "ci_day6 /" naar onze "hmvcExample /".

 ci_day6 / application / controllers / login.php ci_day6 / application / models / membership_model.php ci_day6 / application / views / login_form.php ci_day6 / application / views / signup_form.php ci_day6 / application / views / signup_successful.php

Kopieer / Verplaats elk van de bovenstaande bestanden over zoals hieronder vermeld

 hmvcVoorbeeld / toepassing / modules / login / controllers / login.php hmvcVoorbeeld / toepassing / modules / login / modellen / membership_model.php hmvcExample / application / modules / login / views / login_form.php hmvcVoorbeeld / toepassing / modules / login / views / signup_form .php hmvcVoorbeeld / toepassing / modules / login / views / signup_successful.php

Vervolgens kopiëren we over de plaats module bestanden van "ci_day6 /" naar onze "hmvcExample /".

 ci_day6 / application / controllers / site.php ci_day6 / application / views / logged_in_area.php

Kopieer / Verplaats elk van de bovenstaande bestanden over zoals hieronder vermeld

 hmvcVoorbeeld / toepassing / modules / site / controllers / site.php hmvcVoorbeeld / toepassing / modules / site / weergaven / logged_in_area.php

De laatste bestanden die moeten worden gekopieerd zijn de globale weergaven en CSS- en afbeeldingsbestanden. Het sterretje (*) geeft de map en al zijn inhoud inclusief submappen aan

ci_day6 / css / * ci_day6 / img / * ci_day6 / application / views / includes / *

Kopieer alle bovenstaande mappen en alle bijbehorende inhoud zoals hieronder vermeld

hmvcExample / css / * hmvcExample / img / * hmvcVoorbeeld / toepassing / weergaven / inclusief / *

Open "hmvcExample / application / config / autoload.phpen bewerk het om er zo uit te zien:

$ autoload ['libraries'] = array ('database', 'session'); // Noodzaak om DB en sessie automatisch te laden / * | -------------------------------------------------- ----------------- | Helperbestanden automatisch laden -------------------------------------------------- ----------------- | Voorbeeld: | | $ autoload ['helper'] = array ('url', 'bestand'); * / $ autoload ['helper'] = array ('url', 'vorm'); // Noodzaak om URL en formulier automatisch te laden.

Als je dit nog niet gedaan hebt vanaf stap één, open dan "hmvcExample / application / config / config.php"en bewerk het zodat de basis-URL op uw juiste locatie wordt ingesteld.

$ config ['base_url'] = "http: // localhost / hmvcExample /"; // webadres. WAARSCHUWING blijf volgen /

Open "hmvcExample / application / config / database.php"en voeg de juiste koppelingen toe aan uw database.

$ db ['standaard'] ['hostname'] = "localhost"; // locatie van DB-server $ db ['standaard'] ['gebruikersnaam'] = 'UW GEBRUIKERSNAAM HIER'; // gebruikersnaam die u gebruikt om $ db aan te sluiten ['standaard'] ['wachtwoord'] = 'UW WACHTWOORD HIER'; // geassocieerd wachtwoord $ db ['standaard'] ['database'] = "ci_series"; // De database die u wilt gebruiken

Open uw browser om te testen of de inlogpagina wordt weergegeven "http: //localhost/hmvcExample/index.php/login"

Om deze inlogfunctie te maken, moeten we de lidmaatschapsdatabasetabel maken. Hiervoor moeten we een tabel maken in uw PHPMyAdmin.

Selecteer of maak uw "ci_series"database.

Plak in het tabblad sQL de onderstaande code in het tekstgebied en klik op go

CREATEER DE TABEL 'ci_series'. 'Membership' ('id' INT (11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 'first_name' VARCHAR (32) NOT NULL, 'last_name' VARCHAR (32) NOT NULL, 'email_address' VARCHAR (64) NOT NULL, 'gebruikersnaam' VARCHAR (32) NOT NULL, 'wachtwoord' VARCHAR (32) NOT NULL) ENGINE = MYISAM;

Als de lidmaatschapstabel is aangemaakt, klikken we op de Maak een account aan link op de login pagina en voeg een gebruiker toe aan de database.

Meld u aan als de gebruiker en bevestig dat u zich nu in de "site / members_area"van de site. Het zou op de afbeelding hieronder moeten lijken:

Klik op de koppeling "logoff" en probeer handmatig terug te gaan naar het ledengedeelte. je zult zien dat je geen toestemming meer hebt om dit te doen.

Dus we hebben onze triaden gegroepeerd, maar we zijn nog steeds niet helemaal in de HMVC-modus. In de site-controller vinden we een functie genaamd is_logged_in ().

 function is_logged_in () $ is_logged_in = $ this-> session-> userdata ('is_logged_in'); if (! isset ($ is_logged_in) || $ is_logged_in! = true) echo 'U heeft geen toestemming om deze pagina te openen. Log in'; dood gaan(); 

Dit is een login-gerelateerde functie. In de MVC-modus is dit vereist omdat de site geen toegang heeft tot login. Met HMVC kunnen we dit oplossen.

Knip de functie is_logged_in () uit "applicaties / modules / site / controllers / site.php"

Sla site.php op zonder de functie is_logged_in ().

Open "applicaties / modules / login / controllers / login.php".

Plak de functie is_logged_in () in de klas.

Sla login.php op

Open "applicaties / modules / site / controllers / site.php".

 function __construct () parent :: Controller (); $ This-> is_logged_in (); 

In de functie __Construct () maken we de HMVC-aanroep naar de functie is_logged_in (), zoals hieronder te zien is:

 function __construct () parent :: Controller (); // Format: modules :: run ('module / controller / actie', $ param1, $ param2, ..., $ paramN); modules :: run ( 'login / is_logged_in); 

MVC 101 voltooid

Daar heb je het! We hebben met succes de code van dag zes in HMVC-formaat gewijzigd. De sitemodule vraagt ​​nu de inlogcheck in plaats van dat hij zijn eigen login moet gebruiken. Uiterlijk waarnemen we geen verschil, het ontwerp van de site is fundamenteel veranderd. Alle inlogfuncties zijn nu waar ze thuishoren: in de login-triade. Dit lijkt misschien een hoop werk met kleine beloningen, maar het is niet waar. Aanmeldingswijzigingen kunnen één keer worden doorgevoerd. De interne structuur van de triade kan worden bewerkt zonder de hele applicatie als reactie te hoeven wijzigen. Code-replicatie voor andere controllers is niet langer vereist. Last but not least is alle gerelateerde code op één handige locatie. Deze kleine stap is misschien niet WOW, maar als we dieper ingaan op grotere, complexe toepassingen, dan is de M.O.R.E. Het zal duidelijk worden hoe effectief het HMVC-patroon is.

Leden Sectie Voorbeeld

We gaan nu meer van de kracht van HMVC blootleggen. We hebben zojuist aangetoond hoe een module van een controller te bellen. Er zijn ook andere plaatsen waar je dat kunt doen. HMVC is gebouwd met de gebruikersinterface (UI) in gedachten. We kunnen hierdoor modules van onze mening oproepen. Dit is waar de kracht van HMVC echt kan schijnen.

Wanneer u HMVC vanuit een weergave aanroept, gebruikt u dezelfde modules :: run (). Er is maar één vereiste om dit te doen. De resulterende uitvoer van de oproep moet een html-fragment zijn en geen volledig overzicht. Dit komt omdat we al in een weergave zijn op het moment dat we de run-functie aanroepen. We zullen dit in actie op de pagina zien terwijl we de weergaven van de sitemodules bewerken.

Stap 1. Bewerk login-controller

We gaan een blok maken dat bovenaan elke pagina staat met de naam van onze gebruiker, belangrijke links en uitlogoptie. Widgets zoals deze zijn tegenwoordig heel gewoon op sites. De onderstaande afbeelding illustreert het eindresultaat.

Open "applicaties / modules / login / controllers / login.php".

 function cp () if ($ this-> session-> userdata ('gebruikersnaam')) // laad het model voor deze controller $ this-> load-> model ('membership_model'); // Krijg Gebruikersdetails van Database $ user = $ this-> membership_model-> get_member_details (); if (! $ user) // Geen gevonden gebruiker retourneert false;  else // toon onze widget $ this-> load-> view ('user_widget', $ user);  else // Er is geen sessie dus we keren terug niets retourneert false; 

Plak / schrijf de bovenstaande code in de login-controller.

cp () ontvangt informatie van de membership_model-functie get_member_details (), die we in de volgende stap maken. Als een gebruiker wordt gevonden, wordt het fragment van de weergave weergegeven in stap drie. Vanaf daar zouden we het gewenste blok hierboven moeten krijgen.

Sla de gemaakte wijzigingen op in login.php

Stap 2. Bewerk lidmaatschapsmodel

U zult opmerken dat we een get_member_details () van het membership_model hebben gebeld. Deze functie haalt onze gebruikersinformatie uit de database en is toegankelijk via een aantal verschillende bronnen. Daar gaan we nu aan werken.

Open "applicaties / modules / login / modellen / membership_model.php".

 functie get_member_details ($ id = false) if (! $ id) // Stel actieve record in waar naar de gebruikersnaam van de huidige sessie if ($ this-> session-> userdata ('gebruikersnaam')) $ this-> db- > where ('gebruikersnaam', $ this-> session-> userdata ('gebruikersnaam'));  else // Een niet-ingelogd persoon terugsturen naar het dashboard van het ledenprofiel retourneert false;  else // haal de gebruiker op id $ this-> db-> where ('id', $ id);  // Zoek alle records die overeenkomen met deze zoekopdracht $ query = $ this-> db-> get ('membership'); // In dit geval omdat we geen vinkje hebben ingesteld voor unieke gebruikersnaam // zullen we de laatste gebruiker teruggeven die met de geselecteerde gebruikersnaam is gemaakt. if ($ query-> num_rows ()> 0) // Haal de laatste rij op als er meer dan één $ rij = $ query-> last_row () is; // Wijs de rij toe aan onze return-array $ data ['id'] = $ row-> id; $ data ['first_name'] = $ row-> first_name; $ data ['last_name'] = $ row-> last_name; // Keer terug naar de gevonden gebruiker, retourneer $ gegevens;  else // Geen resultaten gevonden return false; 

Reageer op je code! Het is een best practice en zal anderen helpen te begrijpen wat je hebt geschreven.

Lijn 01: De functie aanroep heeft een standaard variabele $ id. Dit stelt ons in staat om een ​​gebruiker te vinden op basis van ID in plaats van op gebruikersnaam. Dit is optioneel gemaakt door het in de aangifte op false te zetten.

De rest van de functie is eenvoudig en goed becommentarieerd. We vragen de lidmaatschapstabel voor een gebruiker op via gebruikersnaam of ID. Het resultaat wordt opgeslagen in de array $ data en geretourneerd. Alle andere resultaten leveren false op.

Sla de gemaakte wijzigingen op in membership_model.php

Stap 3. Maak User Widget View

Het derde en laatste stuk van de widget die we maken, is het xhtml-fragment, dat we in elke andere weergave kunnen plaatsen. Dit wordt aangeroepen door de cp () -functie van de login-controller die we net hebben geschreven.

Open "applicaties / modules / login / views / user_widget.php".

  ·  |  |  |  

Notitie: Het is geen goede gewoonte om inline styling te gebruiken. Ik heb ervoor gekozen om dit ene exemplaar van inline-stijl te plaatsen om zo over het onderwerp te blijven.

Dit gestileerde codeblok neemt de informatie over die is doorgegeven via de functie cp (). We genereren de koppelingen met de functie anchor () van de URL-helper van CodeIgniter. Meer informatie over de gebruikershandleiding is te vinden op codeigniter.com.

Na het werken aan deze drie bestanden zullen we de "login / cp"pagina. We zouden iets als de afbeelding hieronder moeten zien. Notitie: U moet ingelogd zijn om het te zien. Zorg ervoor dat u dit doet voordat u de pagina controleert, anders ziet u niets.

Stap 4. Bewerk site-controller

De links in het fragment naar profiel en berichten zullen op dit moment een foutmelding geven. Dit is goed, want we hebben die functies nog niet gemaakt. Laten we dat nu doen.

Open "applicaties / modules / site / controllers / site.php".

load> view ( 'logged_in_area'); 

__construct ()
Voor het doel van dit voorbeeld zullen we de ...

modules :: run ( 'login / is_logged_in);

... van de functie, zodat we bepaalde delen privé kunnen maken en andere delen openbaar kunnen maken.

leden gebied()
We willen alleen ingelogde gebruikers toegang tot het dashboardgebied van de leden. Dus zullen we de modules gebruiken: voer de HMVC-functie uit en bel de is_logged_in-cheque van de login-controller. Vervolgens laden we het bestandbestand gelogde_in_area dat verder op de pagina wordt bewerkt.

 functieberichten () modules :: run ('login / is_logged_in'); $ This-> load-> model ( 'login / membership_model'); $ user = $ this-> membership_model-> get_member_details ($ this-> uri-> segment (3)); if (! $ user) // Geen gevonden gebruiker retourneert false;  else // toon onze widget $ this-> load-> view ('member_messages', $ user); 

berichten ()
Net als members_area () willen we alleen ingelogde gebruikers, dus we hebben de check is_logged_in bijgevoegd. We hebben de code al geschreven over het ophalen van gebruikersgegevens uit de database, dus we laden het inlogmodel, membership_model. Hierdoor kunnen we de gebruikersinformatie verkrijgen via de functie get_member_details (). Het derde URI-segment dat aan die functie wordt doorgegeven, is een id voor de gebruiker waarvoor we berichten willen ontvangen. Als de URL bijvoorbeeld was:

http: //localhost/hmvcExample/index.php/site/messages/43

Dan krijgt onze functie get_member_details () "43" als een ingangsvariabele. Afhankelijk van het resultaat van get_member_details (), wordt de weergave getoond: member_messages of we krijgen niets (als gevolg van een mislukte query).

 function profile () $ this-> load-> model ('login / membership_model'); $ user = $ this-> membership_model-> get_member_details ($ this-> uri-> segment (3)); if (! $ user) // Geen gebruiker gevonden $ data ['main_content'] = 'member_profile'; $ data ['notice'] = 'je moet een profiel-ID bekijken'; $ this-> load-> view ('includes / template', $ data);  else // toon onze widget $ user ['main_content'] = 'member_profile'; $ this-> load-> view ('includes / template', $ user); 

profiel()
Net als elk sociaal netwerk; we willen dat de profielpagina's openbaar zijn. Dus we hebben de controle is_logged_in niet opgenomen. Net als berichten noemen we het membership_model van de login-triade en vragen we de database naar onze gewenste gebruiker. In dit geval, als er geen gebruiker wordt gevonden, stoppen we een beetje gracieuzer. We informeren de bezoeker ook dat een id moet worden opgegeven. Met een succesvol resultaat zien we het profiel van het lid.

Stap 5 Bewerken Gelogde gebiedsweergave

Open "applicaties / modules / site / views / logged_in_area.php".

    untitled    

Welkom terug, session-> gebruikersgegevens ( 'username'); ?>!

Dit gedeelte vertegenwoordigt het gebied waartoe alleen ingelogde leden toegang hebben.

Overschrijf de inhoud van het bestand met de bovenstaande code.

Lijn 08: HMVC wordt hier ingezet. Ons standpunt noemt de "login / cp"functie, en echoot het html-fragment precies waar we het vertellen." Merk op hoe we zelf niets moesten voorbereiden? Het wordt allemaal intern afgehandeld door ons in te loggen.?

Sla de aangebrachte wijzigingen op in logged_in_area.php. Uw voltooide pagina zou moeten weergeven als:

Stap 6. Maak weergave voor ledenberichten

Maak een nieuwe weergave: "applicaties / modules / site / views / member_messages.php".

    untitled    

Berichten

Dit kan zijn waar het berichtensysteem wordt weergegeven

Schrijf of plak de bovenstaande code in het zojuist gemaakte bestand.

Deze weergave is zo ongeveer een kloon van het ledengedeelte om te testen of die login op meerdere pagina's staat. Er is één verschil: we hebben wat informatie opgevist uit het membership_model van de login-module. Dit wordt weergegeven als de variabele $ first_name.

Het punt om gebruikersinformatie hier te krijgen zou zijn om het door te geven aan een module die een fragment zou retourneren met de berichten van de gebruiker.

Sla de aangebrachte wijzigingen op in member_messages.php. Uw voltooide pagina zou moeten weergeven als:

Stap 7. Maak een profielweergave voor leden

Maak een nieuwe weergave: "applicaties / modules / site / views / member_profile.php".

   

Ledenprofielpagina's

's profiel

Zet hier alle goede heilzame profielinformatie!

Schrijf of plak de bovenstaande code in het zojuist gemaakte bestand.

We hebben een if-instructie die detecteert of een gebruiker is gevonden of niet. Als dat niet het geval is, krijgen we een foutpagina te zien waarin staat dat we een ID nodig hebben om een ​​profiel te bekijken.

Nogmaals, we halen de gebruikersinformatie op. Net als berichten zouden we dit gebruiken om de vriendenlijst van de gebruiker, het laatste blogbericht en activiteitenfeed, enz. Op te halen.

Sla de aangebrachte wijzigingen op in member_profile.php. Uw voltooide pagina zou moeten weergeven als:

Wat gebeurt er als we afmelden?

Omdat we willen dat de profielpagina's openbaar zijn, moet deze nog steeds worden weergegeven. Minus de gebruikerswidget natuurlijk.

Wanneer ingelogd en we gaan naar profiel zonder een derde urisegment zien we ons eigen profiel. Afgemeld, wordt de onderstaande fout weergegeven.

We moeten het bericht of dashboard niet kunnen bekijken. Als we de berichtenpagina controleren, worden we hier begroet:

Werden gedaan

Dat is het! We hebben meer diepgang aan ons eerste voorbeeld toegevoegd en hebben de verschillende manieren om HMVC te gebruiken aangetoond.

  • Oproepmodules :: uitvoeren () vanaf een controller.
  • Echo-modules :: uitvoeren () vanuit een weergave om een ​​HTML-fragment weer te geven.
  • Laad een model uit een andere module.

Ik hoop dat dit een verhelderende ervaring is geweest. HMVC is een buitengewoon patroon dat toepassingen robuuster maakt. Het is de investering meer dan waard. Probeer het eens. Ik beloof je dat je nooit meer terug wilt naar vanilla MVC!