Cum funcționează Dispeceratul în OpenCart

Î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.

Dispecerizarea pe scurt

Î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:

  • Luați parametrii corespunzători din Obiectul cererii.
  • Găsiți modulul și acțiunea corespunzătoare care vor fi apelate.
  • Dacă modulul și acțiunea corespunzătoare sunt găsite, procesul de dispecerizare se termină.
  • Dacă nu se găsește niciun modul pentru solicitarea dată, acțiunea implicită este setată și procesul de dispecerizare se încheie.

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ă.

  • În primul rând, verifică prezența variabilei de șir de interogare "rută", altfel va seta "comun / home" ca "ruta" implicită a paginii.
  • În cazul nostru, este prezent, deci va stabili variabilele necesare și va declanșa procesul de expediere.
  • La începutul procesului de expediere, acesta va executa unele dintre acțiunile "preAction" folosite pentru a efectua sarcini comune. Vom discuta chestiunea "PreAction" în partea ulterioară a acestui articol.
  • În cele din urmă, va verifica dacă există un fișier de controler disponibil pentru variabila curentă "traseu" și dacă există o singură dată, va fi chemată să preia răspunsul.
  • Dacă nu există nici un fișier de controler disponibil pentru variabila "ruta" solicitată, va executa acțiunea "error / not_found", care va afișa mesajul "pagina nu a fost găsită".

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.

Du-te prin flux

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.

Concluzie

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.

Cod