În calitate de programator, este important să înțelegeți fluxul sistemului cu care lucrați - nu doar pentru a putea modifica ceva când este necesar, ci și pentru că vă va da un impuls de încredere în timp ce faceți acest lucru.
Astăzi, vom alege OpenCart și vom diseca pentru a înțelege elementele de bază ale procesului de dispecerizare. Vom începe cu ceea ce este vorba despre procesul de dispecerizare și, pe măsură ce vom continua, vom examina felii de cod din diferitele secțiuni ale cadrului.
Voi primi cea mai recentă versiune a OpenCart pentru acest articol, dar mai mult sau mai puțin fluxul este similar în versiunile anterioare.
În orice aplicație bazată pe web, procesul de dispecerizare este folosit pentru a găsi maparea între adresa URL a cererii de intrare și modulul corespunzător din cadru. Desigur, implementarea variază de la cadru la cadru, însă conceptul care stau la baza rămâne același. Iată câteva dintre responsabilitățile dispecerului:
Să încercăm să înțelegem acest lucru folosind un exemplu simplu în OpenCart. Pentru a crea un utilizator nou de la front-end, trebuie să vă înregistrați la site utilizând http://www.youropencartstore.com/index.php?route=account/register. Să rezumăm pașii făcuți de OpenCart pentru a reda pagina solicitată.
Deci, aceasta este o vizualizare de nivel superior a modului în care OpenCart trece prin adresa URL solicitată și returnează răspunsul. În următoarea secțiune, vom merge mai adânc și vom vedea exact cum face acest lucru.
Mergeți și deschideți index.php
fișier în rădăcină document OpenCart. Există o mulțime de întâmplări în acel fișier, dar nu vă coplesiți, deoarece cea mai mare parte este doar configurarea obiectelor utilizate în cadrul.
Hai imediat să tragem fragmentul din interesul nostru din acel dosar.
// Front Controller $ controler = Front nou ($ registry); // modul de întreținere $ controller-> addPreAction (acțiune nouă ("comun / întreținere")); // // URL-ul URL-ului lui controler-> addPreAction (noua acțiune ('common / seo_url'));
Ca și în majoritatea celorlalte cadre, OpenCart se bazează, de asemenea, pe modelul controlerului frontal, astfel încât să existe un punct de intrare comun pentru toate solicitările din aplicație.
În primul rând, creăm o instanță a controlerului frontal și îl atribuim $ controler
variabil. Imediat după asta, chemăm addPreAction
pentru a adăuga câteva acțiuni.
Acum, asta aduce un alt subiect pe masă: ce este o "preacțiune"? În termeni simpli, o preacțiune este o acțiune care va fi executată înainte de acțiunea solicitată pe orice pagină. De exemplu, atunci când utilizatorul face clic pe orice pagină, doriți să verificați dacă site-ul este în modul de întreținere sau nu înainte ca răspunsul real să fie returnat. În acest caz, puteți utiliza o preacțiune, astfel încât utilizatorul să fie redirecționat către pagina de întreținere dacă este activată.
De asemenea, adăugăm comună / seo_url
ca și preacțiune, deoarece în cazul unui site activat cu SEO vrem să preluăm variabilele de rută corespunzătoare înainte de începerea dispecerizării efective.
Să trecem la următorul fragment important.
// Router dacă (isset ($ request-> get ['route'])) $ action = acțiune nouă ($ request-> get ['route']); altceva $ action = acțiune nouă ("common / home");
Verifică prezența variabilei șir de interogare "rută" și, dacă este acolo, vom crea o instanță a Acțiune
clasa trecând valoarea curentă a rutei ca argument constructor. Dacă nu este prezent, vom proceda la fel cu URI-ul pentru traseul paginii de pornire-comună / home
.
Cu a noastră acțiune $
set de variabile cu valoarea corectă, să trecem la următorul fragment.
// expediere $ controller-> dispatch ($ action, new Action ('error / not_found'));
În cele din urmă, sunăm expediere
metoda clasei de control frontal. Du-te și deschide-te Sistem / motor / front.php
și găsiți următorul fragment.
expedierea funcției publice ($ action, $ error) $ this-> error = $ error; ($ this-> pre_action ca $ pre_action) $ rezultat = $ this-> execuție ($ pre_action); dacă ($ rezultat) $ action = $ rezultat; pauză; în timp ce ($ action) $ action = $ this-> execute (acțiune $);
Aceasta este metoda în care se desfășoară toată magia! În primul rând, execută toate "preacțiunile" așa cum sa discutat mai devreme. Mai mult, în buclă în timp, vom încerca să ne executăm curentul acțiune $
, trecut ca argument al a executa
metodă.
Să urmăm definiția a executa
în același fișier.
execuția funcției private ($ action) $ result = $ action-> execute ($ this-> registry); dacă (is_object ($ rezultat)) $ action = $ rezultat; elseif ($ result === false) $ action = $ this-> eroare; $ this-> error = "; altceva $ action = false; return $ action;
Pe prima linie, a executa
metodă a Acțiune
clasa este numit. Nu o confunda cu a executa
metoda clasei de control frontal. Deschideți fișierul Sistem / motor / action.php
și aici este.
funcția publică execută ($ registry) // Opriți orice metode magice de apel dacă (substr ($ this-> method, 0, 2) == '__') return false; dacă (is_file ($ this-> file)) include_once ($ this-> file); $ class = $ this->; $ controller = noua clasă $ (registrul $); dacă (is_callable (array ($ controller, $ this-> method))) retur call_user_func (array ($ controller, $ this-> method), $ this-> args); altfel return false; altfel return false;
Cel mai important lucru pe care trebuie să-l observăm aici este faptul că Acțiune
clasa stabilește deja variabilele necesare în constructorul însuși atunci când obiectul de acțiune este instanțiat index.php
. Înființează fişier
, clasă
și metodă
proprietăți, care vor fi folosite în a executa
metodă. Pentru a păstra lucrurile mai puțin complicate, vom discuta doar despre a executa
metoda, deși aș recomanda să treceți prin constructorul Acțiune
clasă.
Înapoi la noi a executa
metodă a Acțiune
verifică prezența fișierului ($ This-> fișier
) asociat cu ruta curentă. Dacă totul este bine, include fișierul respectiv și apelează metoda corespunzătoare ($ This-> metoda
) din acea clasă de controler folosind call_user_func
funcția și returnează răspunsul.
Dacă fișierul asociat nu este disponibil, acesta va reveni fals
. Acum, să revenim la fragmentul din a executa
metoda clasei de control frontal. Fii răbdător, suntem aproape acolo!
... $ result = $ action-> execute ($ this-> registry); dacă (is_object ($ rezultat)) $ action = $ rezultat; elseif ($ result === false) $ action = $ this-> eroare; $ this-> error = "; altceva $ action = false; return $ action; ...
Odată ce metoda de executare a Acțiune
clasa completează procesul, returnează rezultatul și îi este atribuită $ rezultat
variabil. Acum, există trei posibilități diferite cu valoarea stocată în $ rezultat
. Să examinăm fiecare.
Dacă totul a mers bine, vom avea ieșire HTML în $ rezultat
variabile, astfel încât acțiune $
este setată la fals
și procesul se încheie. E ultimul caz.
Amintiți-vă că ne-am întors fals
dacă fișierul controlerului corespunzător nu a fost găsit în a executa
metodă a Acțiune
clasă. În acest caz, acțiune $
va fi setată variabila $ This-> eroare
(eroare negăsită Acțiune
), iar pagina "nu a fost găsită" va fi afișată utilizatorului.
Și, în cele din urmă, dacă descoperim că $ rezultat
este un obiect în sine, îl vom pune la acțiune $
variabil. Da, asta e ciudat: de ce, pe pământ, s-ar întoarce metoda unui controler un altul Acțiune
obiect, când se presupune că va reveni la ieșirea HTML pentru pagina solicitată? Dar acesta este doar unul dintre modurile în care controlorul redirecționează utilizatorii către altă adresă URL.
Să deschidem rapid Catalog / controler / comun / maintenance.php
fișier și să-l vezi în acțiune. În index
, returnează Acțiune
dacă anumite condiții sunt adevărate.
... dacă ($ route! = 'Payment' && $ route! = 'Api') &&! $ This-> user-> isLogged ()) retur noi acțiuni ('common / maintenance / info'); ...
Deci, după cum puteți vedea, se întoarce Acțiune
obiect pentru a redirecționa utilizatorul la comună / întreținere / info
URL-ul. Desigur, există un cod în expediere
metodă a clasei controlerului frontal pentru a trata acest comportament. Amintiți-vă fragmentul de la această metodă - vă promit că este ultimul fragment din acest tutorial.
... în timp ce ($ action) $ action = $ this-> execute ($ action); ...
Deci este o buclă în timp și rulează până când găsește acțiune $
variabil setat la fals
! Mai precis, se va termina bucla atunci când avem o ieșire utilă pentru utilizatorul nostru.
Deci, acesta este sfârșitul călătoriei. Sper că nu a fost atât de complicat cât părea să fie la prima vedere.
Astăzi, am trecut printr-un aspect important al cadrului OpenCart - procesul de dispecerizare. Am înțeles elementele de bază ale dispecerizării și am parcurs fluxul complet pentru a înțelege cum funcționează.
Dacă sunteți în căutarea unor instrumente OpenCart suplimentare, utilitare, extensii și așa mai departe, pe care le puteți folosi în propriile proiecte sau pentru educația proprie, nu uitați să vedeți ce avem la dispoziție pe piață.
Pentru orice întrebări, nu ezitați să lăsați comentarii. De asemenea, Twitter este o altă opțiune pentru contactarea cu mine și eu răspund repede.