Conectarea automată a modulelor în Bitrix

După cum se știe atunci când se dezvoltă pe Bitrix Framework, programatorul trebuie să aibă grijă de conectarea modulelor necesare utilizând metoda CModule :: IncludeModule. Și este necesar să conectați modulele oriunde este accesată api-ul acestor module. În fiecare componentă, șablon, script, funcție, metodă.







Și de ce, de fapt, e problema?

În proiectele mici, probabil că nu reprezintă nici o complexitate, dar în proiecte relativ mari, poate chiar să-l mușcă pe cel mai nemaipomenit programator.

Iată un exemplu simplu, ilustrativ, deși nu foarte vital:

Aici vedem două funcții care primesc liste de partiții prin intermediul blocurilor de informații api. Nu știm în prealabil în ce ordine vor fi chemați aceste funcții și dacă vor fi chemați deloc la acest rezultat. Prin urmare, trebuie să utilizați CModule :: IncludeModule în fiecare dintre ele. Acest lucru duce la blocarea codului cu construcții inutile, făcându-l mai puțin lizibil. Și în mod constant este necesar să ne uităm că toate modulele au fost conectate. Toate acestea creează, deși mici, dar încă incomode pentru dezvoltare, complică întreținerea codurilor. Este deosebit de important pentru proiecte mari.

Ușor de uitat

CModule :: IncludeModule este încă neplăcut în faptul că este ușor să uiți de necesitatea de ao folosi. Faptul este că nu este întotdeauna necesar pentru funcționarea normală a codului dvs. și codul dvs. va funcționa fără ea pentru moment.

Acest lucru este posibil, de exemplu, când, înainte de cod, componenta este în curs de funcționare, care conectează modulul necesar. În acest caz, codul va funcționa bine, indiferent de prezența CModule :: IncludeModule în el. Dar ce se întâmplă dacă administratorul dorește să dezactiveze această componentă? Așa e, eroare fatală.

Poate că pentru cineva un apel permanent la CModule :: IncludeModule nu prezintă nici o complexitate, dar de ce se poate face manual pentru a fi executat automat. În plus, este posibilă conectarea automată a modulelor cu doar câteva linii de cod:

Vom scrie acest cod, de exemplu, în init.php și despre conectarea manuală a modulelor, este posibil să uităm o dată pentru totdeauna.







Problema este indicată, se găsește o soluție. În continuare vor fi multe scrisori despre modul în care funcționează.

Cum funcționează?

Bitrix are propriul autoloader de clasă, care funcționează pe baza unei hărți de clasă. Această cartelă este formată atunci când modulele sunt conectate. Când este conectat, fiecare modul își înregistrează clasele în harta claselor autoloader.

În consecință, dacă modulul nu este conectat, autoloaderul Bitrix nu știe nimic despre clasele sale și nu va putea să le conecteze când este necesar. Ca rezultat, vedem erori fatale dacă folosim o clasă fără a conecta un modul.

Esența soluției este înregistrarea unui alt handler pe stivuirea autoloaderului. Controlați înainte ca acest handler să ajungă numai dacă modulul nu este conectat. Operatorul execută următoarele funcții:

  1. Definirea modulului care face parte din clasa cerută
  2. Conectarea acestui modul
  3. Transferați controlul la autoloaderul Bitrix

A cui este clasa asta?

Autoloaderul modulului trebuie să determine modul în care aparține clasa. În exemplul de mai sus, este folosită o hartă de clasă pentru aceasta, în care clasele sunt atribuite modulelor. Aceasta este cea mai simplă soluție. Cardul este static, este încorporat în cod. Trebuie să fie actualizată, adăugând manual clase noi, ceea ce nu este foarte convenabil.

De fapt, această hartă de clasă, deși oarecum diferită, este încă prezentă în interiorul autoloaderului Bitrix. Poate că există o modalitate de ao extrage, de exemplu folosind Reflecția. În acest caz, este necesară eliminarea manuală a hărții de clasă.

Dar cum rămâne cu funcțiile?

O funcție în interval. În PHP, nu există niciun mecanism pentru funcțiile autoloading. Deci, dacă doriți să utilizați, de exemplu, funcția care rezultă. apoi asigurați-vă că ați conectat modulul de căutare pentru a căuta.

Acum îmi propun să ia o vedere de pasăre despre modul în care autoloading de clase cu module autoloader instalat va funcționa.

Să presupunem că încă nu am conectat modulul bloc de informații și că încercăm să executăm următorul cod:

  1. Clasa CIBlockElement nu a fost încă declarată și PHP are o datorie onorabilă să găsească și să conecteze clasa lipsă la primul handler de la stack-ul de pornire. Adică, autoloaderul Bitrix.
  2. Autologul Bitrix, care încearcă fără succes să găsească CIBlockElement, își pierde încrederea în PHP.
  3. PHP, pentru a rezolva situația, transferă controlul la mâna următoare, adică autoloaderul nostru de module.
  4. Autoloaderul modulului determină faptul că CIBlockElement aparține modulului iblock și conectează acest modul și apoi trece controlul la autoloaderul Bitrix.
  5. Autologul Bitrix, care nu crede norocul său, găsește clasa CIBlockElement în harta claselor sale și, în sfârșit, o conectează.
  6. Profit!

Astfel, cu o mișcare ușoară a mâinilor, ne debarasăm de o altă lucrare de rutină și am făcut procesul de dezvoltare pe Bitrix un pic mai frumos.







Articole similare

Trimiteți-le prietenilor: