HMVC o introducere și o aplicație

Acest tutorial este o introducere în modelul de vizualizare a modelului ierarhic de vizualizare a modelului (HMVC) și modul în care se aplică dezvoltării aplicațiilor web. Pentru acest tutorial, voi folosi exemplele furnizate de CodeIgniter din seria Scratch și voi demonstra cum HMVC poate fi o modificare valoroasă în procesul de dezvoltare. Această introducere presupune că aveți o înțelegere a modelului Model View Viewer (MVC). Vă sugerăm să citiți introducerea la MVC pentru a vă familiariza cu subiectul înainte de a aborda acest tutorial.

Ce este HMVC?

HMVC este o evoluție a modelului MVC folosit astăzi pentru majoritatea aplicațiilor web. A apărut ca un răspuns la problemele de salabilitate aparente în cadrul aplicațiilor care utilizează MVC. Soluția prezentată pe site-ul Web JavaWorld, în iulie 2000, a propus ca modelul standard, vizualizarea și controlerul să devină straiate într-un "ierarhia straturilor MCV părinte-copil"Imaginea de mai jos ilustrează modul în care funcționează:

Fiecare triadă funcționează independent una de cealaltă. O triadă poate cere accesul la o altă triadă prin controlorii lor. Ambele puncte permit ca aplicația să fie distribuită în mai multe locații, dacă este necesar. În plus, stratificarea triadelor MVC permite o dezvoltare mai aprofundată și robustă a aplicațiilor. Acest lucru conduce la mai multe avantaje care ne conduc la următorul punct.

De ce să folosesc HMVC?

Avantaje cheie pentru implementarea modelului HMVC în ciclul de dezvoltare:

  • Modularizarea: Reducerea dependențelor între părțile disparate ale aplicației.
  • Organizare: Având un dosar pentru fiecare dintre triadele relevante face ca sarcina de lucru să fie mai ușoară.
  • reutilizabilitate: Prin natura designului este ușor să reutilizați aproape fiecare bucată de cod.
  • extendibility: Face aplicația mai extensibilă fără a sacrifica ușurința întreținerii.

Aceste avantaje vă vor permite să scoateți M.O.R.E din aplicația dvs. cu mai puține dureri de cap.

Configurarea HMVC în CodeIgniter

Pentru a adăuga o adâncime suplimentară codului CodeIgniter din seria Scratch, vom vedea exemplele de astăzi în CodeIgniter. O să ne conducăm, totuși, prin pașii necesari pentru ca CodeIgniter să lucreze cu HMVC. Odată ce am terminat cu asta, voi oferi câteva exemple. Sa incepem!

Prefaţă

Pentru a rula aplicații web, aveți nevoie de un server web pe computer dacă nu lucrați de la distanță. Iată recomandările cu linkuri la instrucțiunile de instalare:

  • ferestre: XAMPP 1.7.3 - Instrucțiuni de instalare
  • Mac: Porniți "Partajarea personală pe Web" - Instrucțiuni de instalare

Pasul 1. Descărcați și instalați CodeIgniter

Mergeți la codeigniter.com și dați clic pe linkul "Descărcați codul HTML". Dacă știți cum să îl instalați și doriți să treceți peste acest pas, faceți clic aici

Extrageți conținutul fișierului zip în radacina documentului serverului dvs. web.

Redenumiți "CodeIgniter_1.7.2"dosar la"hmvcExample".

Mută ​​"hmvcExample / sistem / aplicație"dosar la"hmvcExample / aplicație"Aceasta este o practică obișnuită cu CodeIgniter." Scopul acestei acțiuni este de a separa aplicația de nucleul cadrului de lucru, iar acum ar trebui să avem un director care arată ca imaginea de mai jos:

Deschis "hmvcExample / application / config / config.php"în editorul dvs. de alegere.

Editați urlul bazei de site pentru a se potrivi cu locația instalării. În cazul meu, aș fi schimbat

$ config ['base_url'] = "http://exemplu.ro";

în

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

Salvați modificările și închideți "hmvcExample / application / config / config.php"

Testați că avem o versiune de lucru a lui CodeIgniter. Deschideți browserul dvs. și verificați "http: // yourhost / hmvcExample /".
Ar trebui să fiți întâmpinați cu ecranul "Bun venit la CodeIgniter" de mai jos:

Asta e! Ați descărcat și instalat cu succes CodeIgniter. Acum vom continua să lucrăm cu extensia HMVC.

Pasul 2. Descărcați și instalați extensia HMVC

Descărcați versiunea 5.2 a extensiei modulare din Wiki-ul CodeIgniter.

În conținutul fișierului zip sunt trei fișiere php:

Deplasați aceste trei fișiere în secțiunea "hmvcExample / aplicație / biblioteci /"dosar.

Verificați din nou browserul. Încă mai trebuie să vedeți ecranul Welcome to CodeIgniter.

Este timpul să adăugați modulele. Creați următoarea structură de directoare "aplicatie / module / de bun venit / controlere /".

Mută ​​"application / controllere / welcome.php" la "aplicatie / module / de bun venit / controlere / welcome.php".

Verificați din nou browserul. Încă mai trebuie să vedeți ecranul Welcome to CodeIgniter.

Creați dosarul "aplicatie / module / de bun venit / opinii /"

Mută ​​"cerere / vizualizari / welcome_message.php" la "aplicatie / module / de bun venit / opinii / welcome_message.php".

Faceți un control final asupra browserului dvs. Încă mai trebuie să vedeți ecranul Welcome to CodeIgniter.

Asta e! Modular Extensions este instalat corect.

Exemplu de modul de conectare

Acum, când avem instanța noastră de CodeIgniter activată de HMVC, voi prezenta câteva exemple scurte. Pentru primul exemplu, vom arăta modul în care puteți aplica restricții privind accesul utilizatorilor la pagini sau la module întregi.

Descărcați și dezarhivați CodeIgniter de la fișierele sursă Ziua 6 în serverul dvs. Web. Ar trebui să ajungeți la un dosar numit "ci_day6 /"alături de"hmvcExample /"

Creați "Logare"modul în"hmvcExample / aplicație"ar trebui să se termine în felul acesta

 hmvcExample / application / modules / login / controllers / hmvcExample / aplicații / module / login / models / hmvcExample /

Creați modulul "site" din directorul "hmvcExample / application". Ar trebui să se arate așa

 hmvcExample / aplicații / module / site / controlere / hmvcExample / aplicații / module / site / models / hmvcExample /

BACSIS: Când lucrez cu module, păstrez un folder numit RENAME cu cele trei controale, modele și vizualizări de foldere goale. Acest lucru mă salvează puțin de câte ori doresc să creez un nou model.

Acum copiem peste Logare module de la "ci_day6 /"la"hmvcExample /".

 ci_day6 / aplicație / controale / login.php ci_day6 / application / models / membership_model.php ci_day6 / application / views / login_form.php ci_day6 / aplicație / vizualizări / signup_form.php ci_day6 / application / views / signup_successful.php

Copiați / mutați fiecare dintre fișierele de mai sus, așa cum este prezentat mai jos

 hmvcExample / application / modules / login / controllers / login.php hmvcExample / application / modules / login / models / membership_model.php hmvcExample / application / modules / login / .php hmvcExemplu / aplicație / module / login / views / signup_successful.php

În continuare, copiem pe teren module de la "ci_day6 /"la"hmvcExample /".

 ci_day6 / aplicație / controluri / site.php ci_day6 / application / views / logged_in_area.php

Copiați / mutați fiecare dintre fișierele de mai sus, așa cum este prezentat mai jos

 hmvcExample / aplicații / module / site / controluri / site.php hmvcExample / aplicații / module / site / views / logged_in_area.php

Ultimile fișiere de copiat sunt vizualizările globale și fișierele CSS și imaginile. Asteriscul (*) denumește dosarul și toate conținutul acestuia, inclusiv subdirectoarele

ci_day6 / css / * ci_day6 / img / * ci_day6 / aplicație / vizualizări / include / *

Copiați fiecare dintre folderele de mai sus și tot conținutul acestora, așa cum este prezentat mai jos

hmvcExample / css / * hmvcExample / img / * hmvcExemplu / aplicație / vizualizări / include / *

Deschis "hmvcExample / application / config / autoload.php"și să o editați pentru a arăta astfel:

$ autoload ['biblioteci'] = array ("baza de date", "sesiune"); // Necesitatea de autoload DB și sesiune / * -------------------------------------------------- ----------------- | Auto-încărcare fișiere Helper | -------------------------------------------------- ----------------- | Prototip: | $ autoload ['helper'] = array ('url', 'fișier'); * / $ autoload ['helper'] = array ('url', 'form'); // Aveți nevoie de autoload url și formă.

Dacă nu ați făcut deja acest lucru de la pasul unu, deschideți "hmvcExample / application / config / config.php"și editați-o astfel încât url-ul de bază să fie setat la locația corespunzătoare.

$ config ['base_url'] = "http: // localhost / hmvcExample /"; // adresa de internet. AVERTISMENT păstrați trailing /

Deschis "hmvcExample / application / config / database.php"și adăugați linkurile corespunzătoare la baza de date.

$ db ['implicit'] ['hostname'] = "localhost"; // locația serverului DB $ db ['default'] ['username'] = 'UTILIZATORUL TU AICI'; // nume de utilizator pe care îl utilizați pentru a conecta $ db ['default'] ['parola'] = "PAROLA DUMNEAVOASTRĂ AICI"; // parola asociată $ db ['default'] ['database'] = "ci_series"; // Baza de date pe care doriți să o utilizați

Deschideți browserul pentru a testa dacă pagina de conectare afișează "http: //localhost/hmvcExample/index.php/login"

Acum, pentru a face această funcție de conectare, trebuie să creați tabelul bazei de date a membrilor. Pentru aceasta, trebuie să creați o tabelă în PHPMyAdmin.

Selectați sau creați "ci_series" Bază de date.

În fila sQL, lipiți codul de mai jos în textarea și faceți clic pe go

(32) NOT NULL, 'last_name' VARCHAR (32) NU NULL, 'email_address' VARCHAR (64) CREATE TABLE 'ci_series' NOT NULL, 'username' VARCHAR (32) NU NULL, 'parola' VARCHAR (32) NOT NULL) ENGINE = MISAM;

Cu tabela de membru creată, faceți clic pe creează cont link pe pagină de conectare și adăugați un utilizator la baza de date.

Conectați-vă ca utilizator și confirmați-vă că sunteți acum în lista "site-ul / members_area"a site-ului. Ar trebui să arate asemănător cu imaginea de mai jos:

Faceți clic pe link-ul "Logare" și încercați să reveniți manual în zona membrilor. veți vedea că nu mai aveți permisiunea să faceți acest lucru.

Așadar, triadele noastre au fost grupate, dar încă nu suntem încă în modul HMVC. În controlerul site-ului găsim o funcție numită is_logged_in ().

 funcția is_logged_in () $ is_logged_in = $ this-> session-> userdata ('is_logged_in'); dacă isset ($ is_logged_in) || $ is_logged_in! = true) echo 'Nu aveți permisiunea de a accesa această pagină. Logare'; a muri(); 

Aceasta este o funcție legată de autentificare. În modul MVC, acest lucru este necesar deoarece site-ul nu poate accesa datele de conectare. Cu HMVC putem rezolva asta.

Tăiați funcția is_logged_in () din "aplicatii / module / site / controlere / site.php"

Salvați site.php fără funcția is_logged_in ().

Deschis "aplicatii / module / conectare / controlere / login.php".

Lipiți funcția is_logged_in () în clasă.

Salvați login.php

Deschis "aplicatii / module / site / controlere / site.php".

 funcția __construct () parentă :: Controlor (); $ This-> is_logged_in (); 

În funcția __Construct (), facem apelul HMVC la funcția is_logged_in (), după cum se vede mai jos:

 funcția __construct () parentă :: Controlor (); // Format: module :: run ('modul / controller / action', $ param1, $ param2, ..., $ paramN); Module :: run ( 'conectare / is_logged_in'); 

MVC 101 completă

Acolo îl ai! Am modificat cu succes codul zilei a șase în format HMVC. Modulul site-ului solicită acum verificarea de autentificare în loc să fie nevoită să utilizeze propriile sale. În timp ce pe plan extern nu observăm nici o diferență, designul site-ului a fost fundamental schimbat. Toate funcțiile de conectare sunt acum în care aparțin: în triada de autentificare. Acest lucru poate părea o mulțime de muncă cu recompensă mică, dar nu este așa. Orice modificări de conectare pot fi făcute o singură dată. Structura internă a triadei poate fi editată fără a trebui să schimbe întreaga aplicație ca răspuns. Replicarea codului pentru alți controlori nu mai este necesară. Nu în ultimul rând, tot codul asociat se află într-o locație la îndemână. Acest pas mic poate ca nu te va ucide, dar atunci cand vom intinde mai adanc in aplicatii mai mari, complexe, M.O.R.E. aparent va deveni cât de eficientă este modelul HMVC.

Secțiunea Membri Exemplu

Acum vom descoperi mai multe puteri ale HMVC. Tocmai am demonstrat cum să sunăm un modul de la un controlor. Există și alte locuri pe care le puteți face și dumneavoastră. HMVC a fost construit cu ajutorul interfeței utilizator (UI). Prin urmare, suntem în căutarea unor module din opiniile noastre. Aici puterea HMVC poate straluci.

Când apelați HMVC dintr-o vizualizare, veți folosi aceleași module :: run (). Există o singură cerință atunci când faceți acest lucru. Rezultatul rezultat din apel trebuie sa fi un fragment html și nu o vizualizare completă. Acest lucru se datorează faptului că suntem deja în interiorul unei viziuni în momentul în care numim funcția de rulare. Vom vedea acest lucru în acțiune pe pagina în timp ce editează vizualizările modulului site.

Pasul 1. Editați controlerul de conectare

Vom crea un bloc care apare în partea de sus a fiecărei pagini cu numele utilizatorului, legături importante și opțiunea de conectare. Widgeturile de acest fel sunt obișnuite pe site-urile de astăzi. Imaginea de mai jos ilustrează rezultatul final.

Deschis "aplicatii / module / conectare / controlere / login.php".

 funcția cp () if ($ this-> session-> userdata ('username')) // încărcați modelul pentru acest controler $ this-> load-> model ('model_model'); // Obțineți detalii despre utilizator din baza de date $ user = $ this-> membership_model-> get_member_details (); dacă (! $ user) // Niciun utilizator nu a găsit return false;  altfel // afișați widgetul $ this-> load-> view ('user_widget', $ user);  altceva // Nu există nicio sesiune pentru a ne întoarce nimic return false; 

Lipiți / Scrieți codul de mai sus în controlerul de conectare.

cp () primește informații din funcția membership_model, get_member_details (), pe care o creăm în pasul următor. Dacă un utilizator este găsit, vom afișa fragmentul de vizualizare detaliat în pasul trei. De acolo ar trebui să obținem blocul dorit ilustrat mai sus.

Salvați modificările efectuate în login.php

Pasul 2. Editați modelul de membru

Veți observa că am denumit get_member_details () din modelul de membru. Această funcție primește informațiile despre utilizatori din baza de date și va fi accesată din câteva surse diferite. Vom lucra la asta acum.

Deschis "aplicatii / module / conectare / modele / membership_model.php".

 funcția get_member_details ($ id = false) if (! $ id) // Setați Active Record unde în numele sesiunii curente dacă ($ this-> session-> userdata ('username' > unde ('username', $ this-> session-> userdata ('username'));  altfel // Întoarce un utilizator care nu este conectat la accesarea tabloului de bord al profilului membru return false;  altfel // a obține utilizatorul după id $ this-> db-> unde ('id', $ id);  // Găsiți toate înregistrările care se potrivesc cu această interogare $ query = $ this-> db-> get ('membru'); // În acest caz, pentru că nu avem un set de cecuri pentru un nume de utilizator unic // vom returna ultimul utilizator creat cu numele de utilizator selectat. dacă ($ query-> num_rows ()> 0) // Obțineți ultimul rând dacă există mai mult de un $ row = $ query-> last_row (); // Alocați rândul matricei noastre de întoarcere $ data ['id'] = $ row-> id; $ date ['first_name'] = $ rând-> primul nume; $ date ['last_name'] = $ rând-> ultimul nume; // Reveniți utilizatorul returnat $ data;  altfel // Nu găsiți rezultate return false; 

Comentariți-vă codul! Este o bună practică și îi va ajuta pe alții să înțeleagă ceea ce ați scris.

Linia 01: Apelul pentru funcții are o variabilă implicită $ id. Acest lucru ne permite să găsim un utilizator prin ID, mai degrabă decât prin numele de utilizator. Acest lucru a devenit opțional prin setarea acestuia la declarația falsă.

Restul funcției este direct și bine comentat. Solicităm tabelul de membri pentru un utilizator prin numele de utilizator sau ID-ul. Rezultatul este salvat în matricea de date $ și returnat. Toate celelalte rezultate revin false.

Salvați modificările pe care le-ați făcut pe site-ul membership_model.php

Pasul 3. Crearea vizualizării widgetului utilizatorului

A treia și ultima piesă a widget-ului pe care îl creăm este fragmentul xhtml, pe care îl putem pune în orice altă vizualizare. Aceasta este numită de funcția cp () a controlerului de conectare pe care tocmai am scris-o.

Deschis "aplicatii / module / conectare / opinii / user_widget.php".

  ·  |  |  |  

Notă: Nu este o practică bună să folosiți stilul inline. Am optat pentru a pune acest exemplu de stil inline de dragul de a rămâne pe subiect.

Acest bloc de coduri șterse preia informațiile transmise de la funcția cp (). Generăm linkurile folosind funcția de ancorare () a lui CodeIgniter. Mai multe informații despre ghidul de utilizare pot fi găsite pe codeigniter.com.

După ce am lucrat la cele trei fișiere, vom testa "autentificare / cp"ar trebui să vedem ceva asemănător imaginii de mai jos. Notă: Trebuie să fiți logat int pentru a vedea. Asigurați-vă că faceți acest lucru înainte de a verifica pagina sau nu veți vedea nimic.

Pasul 4. Editați controlorul site-ului

Legăturile din fragmentul de profil și din mesaje vor afișa o eroare pentru moment. Acest lucru este ok deoarece nu am creat încă aceste funcții. Să facem asta acum.

Deschis "aplicatii / module / site / controlere / site.php".

a sarcinii> vizualizare ( 'logged_in_area'); 

__construi()
În scopul acestui exemplu vom elimina ...

Module :: run ( 'conectare / is_logged_in');

... din funcție, astfel încât să putem face părțile particulare private și să avem alte părți publice.

zona membrilor()
Vrem doar ca utilizatorii conectați să acceseze zona tabloului de bord al membrilor. Așa că vom folosi modulele: executați funcția HMVC și apelați is_logged_in verificarea de la controlerul de conectare. Apoi încărcăm fișierul de vizualizare logged_in_area care va fi editat mai jos în pagină.

 funcții de funcționare () modules :: run ('login / is_logged_in'); $ This-> a sarcinii> model de ( 'conectare / membership_model'); $ user = $ acest-> membru_model-> get_member_details ($ this-> uri-> segment (3)); dacă (! $ user) // Niciun utilizator nu a găsit return false;  altfel // afișați widgetul $ this-> load-> view ('member_messages', $ user); 

(mesaje)
Ca și members_area (), vrem doar utilizatorii conectați, așa că am inclus is_logged_in check. Am scris deja codul despre modul de obținere a detaliilor utilizatorului din baza de date, astfel încât vom încărca modelul de autentificare, modelul de membru. Acest lucru ne va permite să obținem informațiile despre utilizator prin intermediul funcției get_member_details (). Cel de-al treilea segment URI care este transmis în acea funcție este un id pentru utilizatorul pentru care dorim să primim mesaje. De exemplu, dacă adresa URL a fost:

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

Apoi funcția noastră get_member_details () ar primi "43" ca variabilă de intrare. În funcție de rezultatul get_member_details (), suntem afișați vizualizarea: member_messages sau nu obținem nimic (ca urmare a unei interogări nereușite).

 funcția profilului () $ this-> load-> model ('login / membership_model'); $ user = $ acest-> membru_model-> get_member_details ($ this-> uri-> segment (3)); dacă (! $ user) // Niciun utilizator nu a găsit date $ ['main_content'] = 'member_profile'; $ data ['notice'] = 'trebuie să vizualizați un id de profil'; $ this-> load-> view ('include / template', $ date);  altfel // afișați widget-ul $ user ['main_content'] = 'member_profile'; $ this-> load-> view ('include / template', $ user); 

profil()
La fel ca orice rețea socială; dorim ca paginile de profil să fie publice. Deci nu am inclus is_logged_in check. La fel ca mesajele, numim modelul de membru al triadului de conectare și interogăm baza de date pentru utilizatorul dorit. În acest caz, dacă nu se găsește niciun utilizator, ne-am părăsit un pic mai grațios. De asemenea, informăm vizitatorul că trebuie specificat un id. Cu un rezultat de succes, vedem profilul membrilor.

Pasul 5 Editați vizualizarea zonelor logate

Deschis "aplicatii / module / site / opinii / logged_in_area.php".

    fără titlu    

Bine ai revenit, Session-> userdata ( 'username'); ?>!

Această secțiune reprezintă zona pe care numai membrii conectați pot accesa.

Suprascrieți conținutul fișierului cu codul de mai sus.

Linia 08: HMVC este pus în acțiune aici. Vederea noastră numește "autentificare / cp"și redau fragmentul html exact acolo unde îi spunem." Observați cum nu trebuie să ne pregătim pe noi înșine? Totul este tratat intern prin logare pentru noi.?

Salvați modificările pe care le-ați făcut la logged_in_area.php. Pagina dvs. finalizată ar trebui să fie afișată ca:

Pasul 6. Crearea vederii mesajelor membre

Creați o vizualizare nouă: "aplicatii / module / site / opinii / member_messages.php".

    fără titlu    

's Mesaje

Acesta ar putea fi locul în care se afișează sistemul de mesagerie

Scrieți sau lipiți codul de mai sus în fișierul nou creat.

Această vizualizare este destul de mult doar o clonă a zonei membrilor pentru a testa că datele de conectare se află pe mai multe pagini. Există o diferență: am pictat câteva informații din modelul de membru al modulului de conectare. Aceasta este afișată ca variabila $ first_name.

Punctul de a obține informații de utilizator aici ar fi să-l transmiteți unui modul care să returneze un fragment cu mesajele utilizatorului.

Salvați modificările pe care le-ați făcut pe site-ul member_messages.php. Pagina dvs. finalizată ar trebui să fie afișată ca:

Pasul 7. Creați vizualizarea profilului de membru

Creați o vizualizare nouă: "aplicatii / module / site / opinii / member_profile.php".

   

Membrii profilului de membru

Profilul lui

Puneți aici toate informațiile despre profilul bun!

Scrieți sau lipiți codul de mai sus în fișierul nou creat.

Avem o instrucțiune if care detectează dacă un utilizator a fost găsit sau nu. Dacă nu, vom fi aduse la o pagină de eroare în care să menționăm că avem nevoie de un ID pentru a vedea un profil.

Din nou, preluăm informațiile despre utilizator. La fel ca și mesajele, vom folosi acest lucru pentru a recupera lista de prieteni a prietenului, cea mai recentă intrare pe blog și fluxul de activități etc..

Salvați modificările pe care le-ați făcut pe site-ul member_profile.php. Pagina dvs. finalizată ar trebui să fie afișată ca:

Ce se întâmplă atunci când ne reamintim?

Pentru că vrem ca paginile de profil să fie publice, ar trebui să fie afișate. Minus widget-ul utilizatorului, desigur.

Când ne-am conectat și mergem la profil fără un segment trei uri, vedem profilul propriu. Început, vom fi afișați eroarea de mai jos.

Nu ar trebui să vedem mesajul sau tabloul de bord. Când verificăm pagina de mesaje, suntem întâmpinați cu aceasta:

Au fost efectuate

Asta e! Am adăugat o mai mare adâncime exemplului nostru inițial și am demonstrat diferitele modalități de utilizare a HMVC.

  • Call modules :: run () de la un controler.
  • Echo modules :: run () dintr-o vizualizare pentru a afișa un fragment HTML.
  • Încărcați un model dintr-un alt modul.

Sper că aceasta a fost o experiență luminantă. HMVC este un model extraordinar care face aplicațiile mai robuste. Merită bine investiția. Incearca. Îți promit că nu vrei să te întorci la MVC de vanilie!

Cod