Construirea cadrului php pe componentele symfony

Sunteți, ca dezvoltator PHP, cel mai probabil a trebuit să vă ocupați de Symfony. Ei bine, măcar ai auzit de el. Ceea ce probabil nu știți este că Symfony constă în esență dintr-un set de biblioteci separate numite componente. care pot fi utilizate separat în orice aplicație PHP.







De exemplu, cadrul popular Laravel a fost dezvoltat folosind mai multe componente Symfony. În lecția noastră, le vom folosi și ele. Următoarea versiune a popularului Drupal CMS este construită și pe unele dintre componentele majore ale Symfony.

Aici vom examina cum să construim un mic cadru PHP care să utilizeze aceste componente și modul în care pot interacționa pentru a crea structura de bază a oricărei aplicații web.

Construirea cadrului php pe componentele symfony

Observ că în acest articol nu voi lua în considerare fiecare componentă a simfoniei și capacitățile acesteia. Voi vorbi doar despre lucrurile de bază care sunt necesare pentru a construi un cadru minim funcțional. Dacă doriți să deveniți mai familiarizați cu componentele Symfony, vă recomandăm să consultați documentația.

Creați un proiect

Începem de la zero, cu un simplu fișier index.php în rădăcina proiectului, și pentru a seta dependențele, vom folosi compozitorul.

În acest moment, fișierul nostru va conține un fragment simplu de cod:

Acest cod simplifică pur și simplu fragmentul de adresă URL solicitat (conținut în $ _SERVER ['PATH_INFO']) la extrasul de ecou corespunzător. Acesta este un router foarte simplu.

Componenta HttpFoundation

HttpFoundation joacă rolul unei abstracții la nivel înalt pentru lucrul cu fluxul HTTP. Cele mai importante puncte de intrare sunt clasele Cerere și răspuns.

Cererea va permite să lucreze cu informațiile de solicitare HTTP, cum ar fi solicitate antetele URI sau client, este construit pe PHP matrice superglobale ($ _GET. $ _POST., Etc.). Răspunsul este folosit pentru a trimite anteturi și date HTTP clientului, în loc să folosească antetul standard și ecoul. așa cum ar fi în "clasicul" PHP.

Instalează folosind compozitorul:

Această comandă va plasa componenta în directorul furnizorului. Acum lipiți acest cod în fișierul index.php:

Ceea ce am făcut aici nu este ceva special:

  • Creați o instanță a solicitării utilizând metoda statică createFromGlobals. În loc să creeze un obiect gol, acesta umple obiectul Cerere cu datele cererii curente;
  • Verificăm valoarea obținută prin metoda getPathInfo.

De asemenea, putem înlocui construcțiile ecoului cu obiectul Răspuns pentru a stoca ieșirea și utiliza metoda de trimitere pentru a trimite răspunsul clientului (care de fapt scoate antetele și conținutul în bufferul de ieșire).

Folosim HttpKernel ca un înveliș peste nucleul cadrului

În momentul de față avem cel mai simplu caz - toată logica cadrului este localizată în controlerul nostru frontal - fișierul index.php. Dacă vrem să adăugăm mai multe coduri, este mai bine să le separăm într-o altă clasă, care va deveni "nucleul" cadrului nostru.

Componenta HttpKernel a fost concepută doar pentru aceste scopuri. Acesta este conceput pentru a lucra cu HttpFoundation, obiectul Request este transformat într-un obiect Response, și oferă, de asemenea, mai multe clase pentru a atinge acest obiectiv. Acum vom folosi HttpKernelInterface. Această interfață definește o singură metodă: manipulați.

Această metodă ia ca argument argumentul Obiect cerere. și presupune revenirea obiectului Răspuns. Deci orice clasă care implementează această interfață poate procesa o Solicitare. și răspunsul înapoi.

Să creăm clasa Core a cadrului nostru, care implementează interfața HttpKernelInterface. Creați un fișier Core.php în directorul lib / Framework.

Notă. metoda mânerului ia de asemenea două argumente opționale: tipul de interogare și un argument boolean care indică dacă nucleul ar trebui să arunce o excepție în cazul unei erori. În acest articol nu le vom folosi, dar trebuie să implementăm metoda exact în forma descrisă în interfața HttpKernelInterface. altfel PHP va arunca o eroare.

Singurul lucru pe care l-am făcut în acest fragment era de a muta codul pe metoda mânerului. Acum putem să scăpăm de acest cod în fișierul index.php. și folosiți o clasă proaspăt creată:

Sistem de rutare îmbunătățit

Clasa noastră are încă o problemă: încă procesează rutarea în întreaga aplicație. Dacă trebuie să adăugăm noi adrese URL, va trebui să schimbăm codul în interiorul cadrului, ceea ce cu siguranță nu este o idee bună. Mai mult decât atât, acest lucru va necesita adăugarea de noi blocuri pentru fiecare ruta nouă. Nu, cu siguranță nu vrem să mergem pe această cale alunecoasă.







Soluția este de a adăuga un sistem de rutare la cadru. Puteți face acest lucru prin crearea unei metode de hartă. care cartografiază URI la închiderea PHP care va fi executată dacă URI se potrivește cu ruta.

Acum puteți adăuga rute direct la controlerul frontal:

Avem nevoie de un sistem de rutare mai flexibil și mai puternic, de aceea ar trebui să folosim componenta Routing.

Utilizarea componentei Routing ne va permite să transferăm obiectele Route (rute) în UrlMatcher. care se potrivește cu URI-ul solicitat pe ruta corespunzătoare. Acest obiect Traseu poate conține orice atribute care ne ajută să executăm partea dorită a aplicației. În cazul nostru, un astfel de obiect va conține o închidere, care trebuie efectuată în cazul în care traseul coincide. De asemenea, orice parametru dinamic conținut în URL va fi prezent în lista atributelor de rută.

Pentru a implementa acest sistem, trebuie să facem următoarele schimbări:

  • înlocuiți matricea rutelor cu o instanță de RouteCollection. pentru stocarea rutelor noastre;
  • Modificați logica metodei hărții astfel încât să înregistreze o instanță de rută în această colecție;
  • creați un obiect UrlMatcher și spuneți-i cum să se potrivească rutele din URI-ul transmis prin specificarea contextului corespunzător utilizând obiectul RequestContext.

Metoda de potrivire va încerca să găsească un traseu adecvat de-a lungul adresei URL depășite și, dacă va reuși, să returneze atributele de rută corespunzătoare. În caz contrar, ResourceNotFoundException este aruncat. pe care le putem prinde și afișa o pagină 404.

Acum puteți utiliza componenta de rutare pentru a procesa orice tip de parametri. După eliminarea atributului controlerului, puteți apela orice închidere, transmițând parametrii ca argumente (folosind funcția call_user_func_array):

Acum putem procesa cu ușurință adresele URL dinamice ale formularului:

Rețineți că aici facem ceva foarte asemănător cu ceea ce face Symfony: implementăm parametrii URL ai controlerului de care avem nevoie.

Interferem cu procesul cadrului

Cadrul Symfony oferă, de asemenea, o serie de opțiuni pentru implementarea în ciclul de viață a unei interogări și schimbarea ei. Un bun exemplu este stratul de securitate care interceptează solicitarea, care încearcă să acceseze adresa URL protejată.

Toate acestea sunt posibile datorită componentei EventDispatcher. permițând diferitelor componente ale aplicației să comunice una cu cealaltă, implementând Observer Pattern de Design.

În centrul acestei componente este clasa EventDispatcher, care subscrie abonaților la evenimente individuale. Atunci când expeditorul este informat despre eveniment, toți abonații cunoscuți acestuia sunt chemați la acest eveniment. Un abonat poate fi orice funcție sau metodă de apel invers.

Putem implementa acest comportament adăugând proprietatea dispecerului. în care va fi stocat obiectul EventDispatcher. precum și pe. care va lega evenimentul la funcția de apel invers PHP. Vom folosi dispecerul pentru a înregistra funcția de apel invers și pentru generarea ulterioară a evenimentelor în cadru.

Acum avem abilitatea de a înregistra abonații care sunt simple funcții de apel invers. Acum, să scriem metoda de incendiu. care va informa dispecerul că este necesar să se notifice tuturor abonaților cunoscuți că sa produs un eveniment.

În mai puțin de zece linii de cod, am adăugat un sistem bun de procesare a evenimentelor în cadrul nostru, datorită componentei EventDispatcher.

Metoda de expediere acceptă și al doilea argument, obiectul evenimentului. Fiecare eveniment este moștenit de la clasa generală a evenimentului. și este conceput pentru a stoca orice informații legate de eveniment.

Să scriem clasa evenimentului RequestEvent. care va fi chemat imediat de îndată ce cadrul procesează cererea. Desigur, acest eveniment trebuie să aibă acces la cererea curentă, utilizând atributul în care va fi stocată instanța curentă a solicitării.

Acum, puteți termina codul în metoda mânerului astfel încât să genereze un eveniment RequestEvent de fiecare dată când primim o solicitare.

Astfel, toți abonații la acest eveniment vor avea acces la obiectul RequestEvent. precum și la instanța de solicitare curentă. În momentul de față nu am scris un astfel de abonat, dar este ușor să ne imaginăm un handler care va verifica dacă accesul la adresa URL solicitată este înainte de executarea codului principal.

Acesta este un sistem de securitate simplu, dar puteți realiza tot ce doriți, din moment ce au acum posibilitatea de a interveni în cadrul procesului de lucru, în orice moment, care se extinde foarte mult capacitățile sale.

concluzie

Din acest articol, puteți observa că componentele Symfony sunt biblioteci de mare autonomie. Mai mult, ele pot interacționa între ele pentru a forma împreună un cadru care să răspundă nevoilor dvs. Există mult mai multe componente care, dincolo de îndoială, sunt foarte interesante - de exemplu, componentele DependencyInjection sau Security.

Desigur, cadre pe scară largă precum Symfony sau Laravel au folosit aceste componente în plinătatea capabilităților lor, pentru a crea instrumente puternice pe care le avem acum.

Construirea cadrului php pe componentele symfony

Prin obținerea de informații imediat prin două canale (vedere și auz), eficiența predării este mult mai mare decât învățarea din cărți. Și temele și testele online vă vor permite să gândiți în mod constant în limba pe care o învățați și să vă verificați imediat cunoștințele!

Construirea cadrului php pe componentele symfony

Construirea cadrului php pe componentele symfony

Dacă doriți să învățați HTML mult timp, atunci am o veste bună pentru dvs.!

Construirea cadrului php pe componentele symfony

Dacă ați învățat deja HTML și doriți să treceți mai departe, următorul pas este să învățați tehnologia CSS.

Construirea cadrului php pe componentele symfony

Dacă doriți să înțeleagă conceptele de domeniu si hosting, învață cum să creeze o bază de date, încărca fișiere pe un site web prin intermediul unui server FTP, crea subdomenii, configurați cutiile poștale pentru site-ul și să monitorizeze participarea, acest curs este conceput special pentru tine!







Trimiteți-le prietenilor: