HMVC en introduksjon og applikasjon

Denne opplæringen er en introduksjon til det hierarkiske modellvisningskontrollmønsteret (HMVC), og hvordan det gjelder utvikling av webapplikasjoner. For denne opplæringen vil jeg bruke eksempler fra CodeIgniter from Scratch-serien og demonstrere hvordan HMVC kan være en verdifull modifikasjon av utviklingsprosessen. Denne introduksjonen forutsetter at du har en forståelse av modellvisningskontrollmønsteret (MVC). Vi foreslår at du leser introduksjonen til MVC for å bli kjent med emnet før du tar hånd om denne opplæringen.

Hva er HMVC?

HMVC er en utvikling av MVC-mønsteret som brukes til de fleste webapplikasjoner i dag. Det kom som et svar på salgbarhetsproblemene som var tydelige innen applikasjoner som brukte MVC. Løsningen presentert på nettstedet JavaWorld, juli 2000, foreslo at standardmodellen, View og Controller-triaden blir lagdelt i en "hierarki av foreldre-barn MCV lag". Bildet under viser hvordan dette virker:

Hver triade fungerer uavhengig av hverandre. En triad kan be om tilgang til en annen triade via sine kontroller. Begge disse punktene tillater at applikasjonen distribueres over flere steder, om nødvendig. I tillegg muliggjør layering av MVC-triader en mer grundig og robust applikasjonsutvikling. Dette fører til flere fordeler som bringer oss til vårt neste punkt.

Hvorfor skal jeg bruke HMVC?

Viktige fordeler ved å implementere HMVC-mønsteret i utviklingssyklusen din:

  • modularisering: Reduksjon av avhengighet mellom de ulike delene av søknaden.
  • Organisasjon: Å ha en mappe for hver av de aktuelle triadene, gir en lettere arbeidsbelastning.
  • gjenbruk: Av designens natur er det enkelt å gjenbruke nesten alle deler av koden.
  • utvidbarhet: Gjør applikasjonen mer utvidbar uten å ofre lett vedlikehold.

Disse fordelene vil tillate deg å få M.O.R.E ut av din søknad med mindre hodepine.

Sette opp HMVC i CodeIgniter

For å legge til ekstra dybde til CodeIgniter from Scratch-serien, ser vi dagens eksempler i CodeIgniter. Jeg vil lede oss selv om trinnene som trengs for å få CodeIgniter å jobbe med HMVC. Når vi er ferdige med det, gir jeg et par eksempler. La oss begynne!

Forord

For å kjøre webapplikasjoner trenger du en webserver på datamaskinen din hvis du ikke jobber eksternt. Her er anbefalinger med koblinger til installasjonsinstruksjoner:

  • Windows: XAMPP 1.7.3 - Installasjonsinstruksjoner
  • Mac: Slå på "Personlig webdeling" - Installasjonsinstruksjoner

Trinn 1. Last ned og installer CodeIgniter

Gå til codeigniter.com og klikk koblingen "Download CodeIgniter". Hvis du vet hvordan du installerer den og vil hoppe over dette trinnet, klikk her

Trekk ut innholdet i zip-filen til webserverens dokumentrot.

Gi nytt navn til "CodeIgniter_1.7.2"mappe til"hmvcExample".

Flytt "hmvcExample / system / søknad"mappe til"hmvcExample / søknad"Dette er vanlig praksis med CodeIgniter. Formålet med å gjøre dette er å skille applikasjonen fra kjernen i rammen. Vi burde nå ha en katalog som ser ut som bildet nedenfor:

Åpen "hmvcExample / applikasjon / konfig / config.php"i valgfri redaktør.

Rediger nettadressen for nettbasen for å matche plasseringen av installasjonen din. I mitt tilfelle ville jeg forandre seg

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

inn i

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

Lagre endringene dine og lukk "hmvcExample / applikasjon / konfig / config.php"

Test at vi har en fungerende versjon av CodeIgniter. Åpne nettleseren din og sjekk "http: // yourhost / hmvcExample /".
Du bør bli møtt med skjermbildet "Velkommen til CodeIgniter" nedenfor:

Det er det! Du har lastet ned og installert CodeIgniter. Nå vil vi fortsette å få det til å fungere med HMVC-utvidelsen.

Trinn 2. Last ned og installer HMVC Extension

Last ned versjon 5.2 av den modulære utvidelsen fra CodeIgniter Wiki.

I innholdet i zip-filen er tre php-filer:

Flytt disse tre filene til "hmvcExample / application / bibliotek /" mappe.

Kontroller nettleseren din. Du bør fortsatt se skjermbildet Velkommen til CodeIgniter.

Det er på tide å legge til modulene. Opprett følgende katalogstruktur "application / moduler / velkommen / kontrollere /".

Flytt "application / kontrollere / welcome.php" til "application / moduler / velkommen / kontrollere / welcome.php".

Kontroller nettleseren din. Du bør fortsatt se skjermbildet Velkommen til CodeIgniter.

Opprett mappen "application / moduler / velkommen / visninger /"

Flytt "application / visninger / welcome_message.php" til "application / moduler / velkommen / visninger / welcome_message.php".

Gjør en endelig sjekk på nettleseren din. Du bør fortsatt se skjermbildet Velkommen til CodeIgniter.

Det er det! Modulære utvidelser er installert riktig.

Innloggingsmodul Eksempel

Nå som vi har vår HMVC-aktiverte forekomst av CodeIgniter, vil jeg vise noen korte eksempler. For vårt første eksempel vil jeg vise hvordan du kan bruke begrensninger for brukertilgang til sider eller hele moduler.

Last ned og pakke ut CodeIgniter fra kildekode 6 kildefiler til webserveren din. Du skal ende opp med en mappe som heter "ci_day6 /"ved siden av vår"hmvcExample /"

Opprett "Logg Inn"modul i vår"hmvcExample / søknad"katalog. Det skal ende med å se slik ut

 hmvcExample / application / modules / login / controllers / hmvcExample / application / moduler / login / models / hmvcExample / application / modules / login / views /

Opprett "site" -modulen i katalogen "hmvcExample / application". Det skal ende med å se slik ut

 hmvcExample / application / modules / site / controllers / hmvcExample / application / moduler / site / models / hmvcExample / application / modules / site / views /

TIPS: Når jeg jobber med moduler, beholder jeg en mappe som heter RENAME med de tre tomme mappene kontrollerene, modellene og visningene. Dette sparer meg litt tid når som helst jeg ønsker å lage en ny modell.

Nå kopierer vi over Logg Inn modulfiler fra "ci_day6 /" til vår "hmvcExample /".

 ci_day6 / søknad / kontroller / login.php ci_day6 / application / models / membership_model.php ci_day6 / søknad / visninger / login_form.php ci_day6 / søknad / visninger / signup_form.php ci_day6 / application / views / signup_successful.php

Kopier / Flytt hver av de ovennevnte filene over som vist nedenfor

 hmvcExample / application / modules / login / controllers / login.php hmvcExample / application / modules / login / models / membership_model.php hmvcExample / application / modules / login / views / login_form.php hmvcExample / application / modules / login / visninger / signup_form .php hmvcExample / application / modules / login / views / signup_successful.php

Neste kopierer vi over nettstedet modulfiler fra "ci_day6 /" til vår "hmvcExample /".

 ci_day6 / søknad / controllers / site.php ci_day6 / application / views / logged_in_area.php

Kopier / Flytt hver av de ovennevnte filene over som vist nedenfor

 hmvcExample / application / modules / site / controllers / site.php hmvcExample / application / modules / site / views / logged_in_area.php

De siste filene som skal kopieres over, er de globale visningene og CSS og bildefiler. Stjernen (*) angir mappe og alt innhold, inkludert undermapper

ci_day6 / css / * ci_day6 / img / * ci_day6 / søknad / visninger / inkluderer / *

Kopier hver av de ovennevnte mappene og alt innholdet sitt som vist nedenfor

hmvcExample / css / * hmvcExample / img / * hmvcExample / application / views / includes / *

Åpen "hmvcExample / applikasjon / konfig / autoload.php"og rediger den for å se slik ut:

$ autoload ['libraries'] = array ('database', 'økt'); // Trenger du å autoload DB og Session / * | -------------------------------------------------- ----------------- | Auto-load Helper Files | -------------------------------------------------- ----------------- | Prototype: | | $ autoload ['helper'] = array ('url', 'fil'); * / $ autoload ['helper'] = array ('url', 'form'); // Trenger du å autoload url og skjema.

Hvis du ikke allerede har gjort det fra trinn ett, åpner du "hmvcExample / applikasjon / konfig / config.php"og rediger det slik at basisadressen er satt til riktig sted.

$ config ['base_url'] = "http: // localhost / hmvcExample /"; // nettadresse. ADVARSEL Fortsett å binde /

Åpen "hmvcExample / applikasjon / konfig / database.php"og legg til de riktige koblingene til databasen din.

$ db ['standard'] ['hostname'] = "localhost"; // plassering av DB-server $ db ['standard'] ['brukernavn'] = "DITT BRUKERNUMMER HER"; // brukernavn du bruker til å koble $ db ['standard'] ['passord'] = "DITT PASSORDORD"; // tilknyttet passord $ db ['standard'] ['database'] = "ci_series"; // Databasen du vil bruke

Åpne nettleseren din for å teste at påloggingssiden viser "http: //localhost/hmvcExample/index.php/login"

Nå for å gjøre denne innloggingsfunksjonen, må vi opprette tabellen for medlemskapsdatabase. For dette må vi opprette et bord i PHPMyAdmin.

Velg eller lag din "ci_series"database.

I sq-kategorien, lim inn koden under i tekstområdet og klikk på gå

CREATE TABLE 'ci_series'. 'Medlemskap' ('id' INT (11) IKKE NULL AUTO_INCREMENT PRIMARY KEY, 'first_name' VARCHAR (32) IKKE NULL, 'siste navn' VARCHAR (32) IKKE NULL, 'email_address' VARCHAR (64) IKKE NULL, 'brukernavn' VARCHAR (32) IKKE NULL, 'passord' VARCHAR (32) IKKE NULL) MOTOR = MYISAM;

Med medlemskapstabellen opprettet klikker vi på Opprett konto lenke på innloggingssiden og legg til en bruker i databasen.

Logg inn som bruker og bekreft at du er nå i "site / members_area"av nettstedet. Det skal se ut som bildet nedenfor:

Klikk på koblingen "logg" og prøv å manuelt gå tilbake til medlemmene. Du vil se at du ikke lenger har tillatelse til å gjøre det.

Så vi har våre triader gruppert, men vi er fortsatt ikke helt i HMVC-modus ennå. I nettstedet kontrolleren finner vi en funksjon som heter is_logged_in ().

 funksjon is_logged_in () $ is_logged_in = $ this-> session-> userdata ('is_logged_in'); hvis (! isset ($ is_logged_in) || $ is_logged_in! = true) echo 'Du har ikke tillatelse til å få tilgang til denne siden. Logg Inn'; dø(); 

Dette er en innloggingsrelatert funksjon. I MVC-modus er dette påkrevd fordi nettstedet ikke kan få tilgang til innlogging. Med HMVC kan vi fikse dette.

Klipp funksjonen is_logged_in () av ​​"applikasjoner / moduler / site / kontrollere / site.php"

Lagre site.php uten is_logged_in () -funksjonen.

Åpen "applikasjoner / moduler / login / kontrollere / login.php".

Lim inn funksjonen is_logged_in () i klassen.

Lagre login.php

Åpen "applikasjoner / moduler / site / kontrollere / site.php".

 funksjon __construct () foreldre :: Controller (); $ Dette-> is_logged_in (); 

I funksjonen __Construct () gjør vi HMVC-anropet til loggins funksjon is_logged_in (), som vist nedenfor:

 funksjon __construct () foreldre :: Controller (); // Format: moduler :: run ('modul / controller / action', $ param1, $ param2, ..., $ paramN); Modulene :: løp ( 'innlogging / is_logged_in'); 

MVC 101 Fullført

Der har du det! Vi har med held endret dag seks kode inn i HMVC format. Nettstedmodulen ber nå innloggingskontrollen i stedet for å bruke sin egen. Mens vi ser utover, ser vi ingen forskjell, siden utformingen er fundamentalt blitt endret. Alle innloggingsfunksjoner er nå der de tilhører: inne i innloggetriaden. Dette kan virke som mye arbeid med liten belønning, men det er ikke slik. Eventuelle påloggingsendringer kan gjøres en gang. Den interne strukturen til triaden kan redigeres uten å måtte endre hele applikasjonen som svar. Kodreplikering for andre kontroller er ikke lenger nødvendig. Sist men ikke minst, er all relatert kode på en praktisk plassering. Dette lille trinnet kan ikke WOW du, men når vi dykker dypere inn i større, komplekse applikasjoner, M.O.R.E. tilsynelatende blir det så effektivt HMVC-mønsteret.

Medlemmerseksempel

Vi kommer nå til å avdekke mer av HMVCs makt. Vi har nettopp demonstrert hvordan å ringe en modul fra en kontroller. Det er andre steder du kan gjøre det også. HMVC ble bygd med brukergrensesnittet (UI) i tankene. Vi kommer til å ringe moduler fra våre synspunkter som et resultat. Dette er hvor kraften til HMVC virkelig kan skinne.

Når du ringer HMVC fra en visning, bruker du de samme modulene :: run (). Det er bare ett krav når du gjør dette. Den resulterende produksjonen fra anropet vær en HTML-kode og ikke en fullstendig visning. Dette skyldes at vi allerede er i en visning på det tidspunktet vi kaller løpefunksjonen. Vi ser dette i handling nedover siden da vi rediger nettstedsmodulene.

Trinn 1. Rediger påloggingscontroller

Vi skal lage en blokk som vises øverst på hver side med brukerens navn, viktige koblinger og utloggingsalternativ. Widgets som dette er vanlige på nettsteder i dag. Bildet nedenfor viser sluttresultatet.

Åpen "applikasjoner / moduler / login / kontrollere / login.php".

 funksjon cp () if ($ this-> session-> userdata ('brukernavn')) // laste modellen for denne kontrolleren $ this-> load-> model ('membership_model'); // Få brukerdetaljer fra Database $ user = $ this-> membership_model-> get_member_details (); hvis (! $ bruker) // Ingen bruker funnet tilbake false;  ellers // vise vår widget $ this-> load-> view ('user_widget', $ bruker);  else // Det er ingen økt så vi returnerer ingenting tilbake falskt; 

Lim inn / skriv inn koden ovenfor i loggkontrollen.

cp () mottar informasjon fra member_model-funksjonen, get_member_details (), som vi lager i neste trinn. Hvis en bruker er funnet, vil vi vise visningsbiten detaljert i trinn tre. Derfra skal vi få ønsket blokk illustrert ovenfor.

Lagre endringene du gjorde til login.php

Trinn 2. Rediger medlemskapsmodell

Du vil merke at vi ringte en get_member_details () fra member_model. Denne funksjonen får vår brukerinformasjon fra databasen og vil bli benyttet fra noen få forskjellige kilder. Vi skal jobbe med det nå.

Åpen "programmer / moduler / login / modeller / membership_model.php".

 funksjon get_member_details ($ id = false) if (! $ id) // Still inn aktiv post hvor til brukerens brukernavn hvis ($ this-> session-> userdata ('brukernavn')) $ this-> db- > hvor ('brukernavn', $ this-> session-> userdata ('brukernavn'));  ellers // Returner en ikke-innlogget person fra å få tilgang til medlemsprofilens dashbord, return false;  annet // få brukeren etter id $ this-> db-> hvor ('id', $ id);  // Finn alle poster som samsvarer med denne spørringen $ query = $ this-> db-> get ('membership'); // I dette tilfellet fordi vi ikke har en sjekk for unikt brukernavn //, returnerer vi den siste brukeren som er opprettet med valgt brukernavn. hvis ($ query-> num_rows ()> 0) // Få siste rad hvis det er mer enn en $ row = $ query-> last_row (); // Tilordne raden til returmenyen $ data ['id'] = $ row-> id; $ data ['first_name'] = $ row-> first_name; $ data ['last_name'] = $ row-> last_name; // Returner brukeren funnet retur $ data;  else // Ingen resultater funnet return false; 

Kommenter koden din! Det er en god praksis og vil hjelpe andre å forstå hva du skrev.

Linje 01: Funksjonsanropet har en standardvariabel $ id. Dette gir oss mulighet til å finne en bruker etter ID i stedet for brukernavn. Dette ble gjort valgfritt ved å sette det til feil i erklæringen.

Resten av funksjonen er rett frem og godt kommentert. Vi spør medlemskapstabellen for en bruker via brukernavn eller ID. Resultatet lagres i $ data array og returneres. Alle andre utfall returnerer falsk.

Lagre endringene du har laget til membership_model.php

Trinn 3. Lag User Widget View

Det tredje og siste stykket til widgeten vi oppretter, er xhtml-snippet, som vi kan sette inn i en hvilken som helst annen visning. Dette kalles av loggkontrollens cp () -funksjon som vi nettopp skrev.

Åpen "programmer / moduler / login / visninger / user_widget.php".

  ·  |  |  |  

Merk: Det er ikke en god praksis å bruke inline styling. Jeg valgte å sette denne ene forekomsten av inline-stil for å gjenstå på emnet.

Denne stilte kodeblokken tar informasjonen som sendes fra cp () -funksjonen. Vi genererer koblingene ved hjelp av CodeIgniter's URL-hjelperens anker () -funksjon. Mer informasjon om brukerhåndboken finner du på codeigniter.com.

Etter å ha jobbet på disse tre filene vil vi teste "login / cp"side. Vi bør se noe som bildet nedenfor. Merk: Du må være logget inn for å se den. Sørg for å gjøre det før du sjekker siden, eller du vil ikke se noe.

Trinn 4. Rediger nettstedskontroller

Koblingene i koden til profil og meldinger vil returnere en feil for øyeblikket. Dette er ok fordi vi ikke har opprettet disse funksjonene ennå. La oss gjøre det nå.

Åpen "applikasjoner / moduler / site / kontrollere / site.php".

last> vis ( 'logged_in_area'); 

__construct ()
For dette eksemplet skal vi fjerne ...

Modulene :: løp ( 'innlogging / is_logged_in');

... fra funksjonen slik at vi kan lage bestemte deler privat og ha andre deler offentlig.

members_area ()
Vi ønsker bare innloggede brukere for å få tilgang til medlemmene dashbord-området. Så vi skal bruke modulene: Kjør HMVC-funksjonen og ring is_logged_in sjekken fra loggkontrollen. Vi laster deretter innloggingsfilen logged_in_area som vil bli redigert lenger ned på siden.

 funksjonsmeldinger () moduler :: run ('login / is_logged_in'); $ Dette-> last> modell ( 'login / membership_model'); $ user = $ this-> membership_model-> get_member_details ($ this-> uri-> segment (3)); hvis (! $ bruker) // Ingen bruker funnet tilbake false;  ellers // vise vår widget $ this-> load-> view ('member_messages', $ bruker); 

meldinger ()
Som members_area (), vil vi bare ha innlogget brukere, så vi har tatt med is_logged_in-sjekken. Vi har allerede skrevet koden på hvordan du får brukerdetaljer fra databasen, så vi vil laste inn innloggingsmodellen, membership_model. Dette vil tillate oss å få brukerinformasjonen via get_member_details () -funksjonen. Det tredje URI-segmentet som sendes inn i den funksjonen, er et ID for brukeren vi ønsker å få meldinger til. For eksempel, hvis nettadressen var:

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

Da vil vår funksjon get_member_details () motta "43" som en input variabel. Avhengig av resultatet av get_member_details (), er vi enten vist visningen: member_messages eller vi får ingenting (som et resultat av et mislykket søk).

 funksjonsprofil () $ this-> load-> modell ('login / membership_model'); $ user = $ this-> membership_model-> get_member_details ($ this-> uri-> segment (3)); hvis (! $ bruker) // Ingen bruker funnet $ data ['main_content'] = 'member_profile'; $ data ['notice'] = 'du må vise et profil-ID'; $ this-> load-> view ('includes / template', $ data);  ellers // vise vår widget $ bruker ['main_content'] = 'member_profile'; $ this-> load-> view ('includes / template', $ bruker); 

profil()
Akkurat som alle sosiale nettverk; vi vil at profilene skal være offentlige. Så vi har ikke inkludert is_logged_in sjekken. Akkurat som meldinger, kaller vi login triadens medlemskapsmodell og spørre databasen til ønsket bruker. I dette tilfellet, hvis ingen bruker er funnet, slutter vi litt mer grasiøst. Vi underretter også besøkende om at et ID må spesifiseres. Med et vellykket resultat ser vi medlemmets profil.

Trinn 5 Rediger Logget i områdevisning

Åpen "applikasjoner / moduler / site / visninger / logged_in_area.php".

    uten navn    

Velkommen tilbake, økt-> brukerdata ( 'brukernavn'); ?>!

Denne delen representerer området som bare logget inn medlemmer kan få tilgang til.

Overskriv innholdet i filen med koden ovenfor.

Linje 08: HMVC blir satt i gang her. Vårt syn kaller "login / cp"-funksjonen og ekko ut HTML-koden nøyaktig hvor vi forteller det. Legg merke til hvordan vi ikke hadde til å forberede noe selv? Alt håndteres internt ved å logge inn for oss. Handy er det ikke?

Lagre endringene du har laget til logged_in_area.php. Din ferdige side skal vises som:

Trinn 6. Lag medlemsmeldingsvisning

Opprett en ny visning: "applikasjoner / moduler / site / visninger / member_messages.php".

    uten navn    

sine meldinger

Dette kan være hvor meldingssystemet blir vist

Skriv eller lim inn koden ovenfor i den nylig opprettede filen.

Denne visningen er ganske mye bare en klone av medlemmene området for å teste at innlogging holder på flere sider. Det er en forskjell: Vi fisket litt informasjon fra innloggingsmodulets membership_model. Dette vises som $ first_name-variabelen.

Poenget med å få brukerinformasjon her er å sende det videre til en modul som ville returnere en utdrag med brukerens meldinger.

Lagre endringene du har gjort til member_messages.php. Din ferdige side skal vises som:

Trinn 7. Opprett medlemsprofilvisning

Opprett en ny visning: "applikasjoner / moduler / site / visninger / member_profile.php".

   

Medlemsprofil Sider

s profil

Sett all den gode, sunne profilinformasjonen her!

Skriv eller lim inn koden ovenfor i den nylig opprettede filen.

Vi har en if-setning som oppdager om en bruker ble funnet eller ikke. Hvis ikke, kommer vi til en feil side som sier at vi trenger en ID for å vise en profil.

Igjen, henter vi brukerinformasjonen. Akkurat som meldinger vil vi bruke dette til å hente brukerens venneliste, siste bloggoppføring og aktivitetsfeed, etc..

Lagre endringene du har gjort til member_profile.php. Din ferdige side skal vises som:

Hva skjer når vi logger ut?

Fordi vi ønsker at profilene skal være offentlige, skal det fortsatt vises. Minus bruker-widgeten selvfølgelig.

Når du er logget inn, og vi går til profil uten et tredje uri-segment, ser vi vår egen profil. Logget av, vi vil bli vist feilen nedenfor.

Vi burde ikke kunne se meldingen eller dashbordet. Når vi sjekker meldingssiden blir vi møtt med dette:

Vi er ferdige

Det er det! Vi har lagt til mer dybde i vårt opprinnelige eksempel og demonstrert forskjellige måter å bruke HMVC på.

  • Ring moduler :: run () fra en kontroller.
  • Ekkomoduler :: run () fra en visning for å vise en HTML-kode.
  • Legg inn en modell fra en annen modul.

Jeg håper dette har vært en opplysende opplevelse. HMVC er et ekstraordinært mønster som gjør applikasjonene mer robuste. Det er vel verdt investeringen. Gi det et forsøk. Jeg lover at du aldri vil gå tilbake til vanilje MVC!