Înțelegeți elementele de bază ale Laravel Middleware

În acest articol, ne vom arunca adânc în cadrul Laravel pentru a înțelege conceptul de middleware. Prima jumătate a articolului începe cu o introducere la middleware și pentru ce se folosește de fapt.

Pe măsură ce continuăm, vom aborda modul de creare a unui middleware personalizat într-o aplicație Laravel. După crearea middleware-ului personalizat, vom examina opțiunile disponibile pentru înregistrarea acestuia la Laravel, astfel încât acesta să poată fi efectiv invocat în timpul fluxului de procesare a solicitărilor.

Sper că vă considerați familiarizați cu conceptele de bază Laravel și cu instrumentul de linie de comandă Artisan pentru a genera codul de schelă. Desigur, o instalare de lucru a celei mai recente aplicații Laravel vă permite să rulați imediat exemplele din acest articol.

Ce este Middleware în Laravel?

Ne-am putea gândi la middleware ca pe un mecanism care vă permite să vă conectați la fluxul de procesare tipic al cererii unei aplicații Laravel. O prelucrare tipică a traseului Laravel trece prin anumite etape ale procesării cererii, iar middleware-ul este unul dintre acele straturi pe care trebuie să treacă o aplicație.

Deci, care este exact punctul de a intra în fluxul de procesare a solicitărilor Laravel? Gândiți-vă la ceva care necesită o execuție în primele etape de bootstrapping a unei aplicații. De exemplu, este necesar să autentificați utilizatorii din stadii incipiente pentru a decide dacă li se permite să acceseze ruta curentă.

Câteva lucruri pe care mi-aș putea imagina că le puteți realiza prin middleware sunt:

  • înregistrarea cererilor
  • redirecționarea utilizatorilor
  • modificarea / dezinfectarea parametrilor de intrare
  • manipularea răspunsului generat de aplicația Laravel
  • si multe altele

De fapt, aplicația Laravel implicită livrează deja câteva piese importante de middleware cu ea. De exemplu, există un middleware care verifică dacă site-ul este în modul de întreținere. Pe de altă parte, există middleware pentru a dezinstala parametrii solicitării de intrare. După cum am menționat mai devreme, autentificarea utilizatorilor este realizată și de middleware-ul însuși.

Sper că explicația de până acum vă ajută să vă simțiți mai încrezători în termenul de middleware. Dacă sunteți în continuare confuz, nu vă faceți griji pentru că vom construi o bucată de middleware personalizat din următoarea secțiune care ar trebui să vă ajute să înțelegeți exact modul în care middleware-ul ar putea fi folosit în lumea reală.

Cum se creează middleware personalizat

În această secțiune, vom crea un middleware personalizat. Dar ce anume va fi realizat de middleware-ul nostru personalizat?

Recent, am întâmpinat o cerință personalizată din partea clientului meu că, dacă utilizatorii accesează site-ul de pe orice dispozitiv mobil, aceștia ar trebui să fie redirecționați către URL-ul subdomeniu corespunzător cu toți parametrii de interogare ai interogării intacte. Cred că acesta este cazul de utilizare perfectă pentru a demonstra cum ar putea fi folosit modulul middleware Laravel în acest scenariu.

Motivul pentru care am dori să folosim middleware în acest caz este nevoia de a cârti în fluxul cererii aplicației. În middleware-ul nostru personalizat, vom examina agentul utilizator și utilizatorii vor fi redirecționați către adresa URL mobilă corespunzătoare dacă utilizează un dispozitiv mobil.

După ce am discutat despre toată această teorie, să sarăm în dezvoltarea reală și acesta este cel mai bun mod de a înțelege un nou concept, nu-i așa??

În calitate de dezvoltator Laravel, este instrumentul Artisan pe care veți termina cel mai mult timp pentru a crea codul șablonului de bază dacă doriți să creați orice funcționalitate personalizată. Să o folosim pentru a crea un cod de șablon de bază pentru middleware-ul nostru personalizat.

Mergeți pe linia de comandă și mergeți la rădăcina de document a proiectului dvs. Rulați următoarea comandă pentru a crea șablonul de middleware personalizat MobileRedirect.

php artisan face: middleware MobileRedirect

Și asta ar trebui să creeze un fișier app / HTTP / Middleware / MobileRedirect.php cu următorul cod.

De cele mai multe ori, veți observa punerea în aplicare a mâner metodă care acționează ca coloana vertebrală a middleware-ului și logica primară a middleware-ului pe care îl căutați să îl implementați ar trebui să meargă aici.

Permiteți-mi să profit de această ocazie pentru a introduce tipurile de middleware cu care vine Laravel. În principal, acestea sunt două tipuri - înainte de middleware și după middleware.

După cum sugerează și numele, înainte de middleware este ceva care rulează înainte ca cererea să fie de fapt tratată și răspunsul este construit. Pe de altă parte, programul middleware rulează după ce cererea este gestionată de aplicație, iar răspunsul este deja construit în acest moment.

În cazul nostru, trebuie să redirecționăm utilizatorul înainte ca cererea să fie tratată și, prin urmare, va fi dezvoltată ca o soluție intermediară.

Continuați și modificați fișierul app / HTTP / Middleware / MobileRedirect.php cu următorul conținut.

mobile == "1") returnează redirecționarea ("mobile-site-url-goes-here");  return $ next ($ request);  

Din motive de simplitate, verificăm doar existența mobil querystring și dacă este setat la ADEVĂRAT, utilizatorul va fi redirecționat către adresa URL corespunzătoare a site-ului mobil. Desigur, doriți să utilizați biblioteca de detectare a agentului de utilizator dacă doriți să o detectați în timp real.

De asemenea, doriți să înlocuiți mobil-site-ul URL-merge-aici trasează cu traseul sau cu URL-ul corect, deoarece este doar un substituent pentru demonstrații.

Urmărind logica noastră personalizată, suntem invitați $ Next (cerere $) care permite ca cererea să fie prelucrată în continuare în lanțul de aplicații. Cel mai important lucru de remarcat în cazul nostru este faptul că am plasat logica de detectare a dispozitivelor mobile înainte de $ Next (cerere $) apel, făcându-l în mod eficient înainte de middleware.

Și cu asta, middleware-ul nostru personalizat este aproape gata să fie testat. În momentul de față, Laravel nu știe despre middleware-ul nostru. Pentru a face acest lucru, trebuie să vă înregistrați middleware-ul cu aplicația Laravel și acesta este exact subiectul secțiunii următoare.

Înainte de a vă îndrepta în secțiunea următoare, aș dori să demonstrez modul în care arată middleware-ul, în cazul în care cineva acolo este curios.

Așa cum ați fi observat deja, logica personalizată a middleware-ului este executată după ce cererea este procesată de aplicația Laravel. În acest moment, aveți acces la răspuns $ obiect, de asemenea, care vă permite să manipulați anumite aspecte ale acesteia, dacă doriți.

Așa a fost povestea după middleware.

Software-ul meu personalizat în acțiune

Această secțiune descrie procesul de înregistrare a middleware-ului cu aplicația Laravel, astfel încât acesta să poată fi invocat efectiv în timpul fluxului de procesare a cererii.

Continuați și deschideți fișierul app / HTTP / Kernel.php și căutați fragmentul următor.

/ ** * Stack-ul global middleware HTTP al aplicației. * * Aceste middleware se execută în timpul fiecărei solicitări către aplicația dvs. * * @var array * / protejate $ middleware = [\ Illuminate \ Foundation \ Http \ Middleware \ CheckForMaintenanceMode :: clasa, \ Illuminate \ Foundation \ Http \ Middleware \ ValidatePostSize :: clasa, \ App \ Http \ Middleware \ TrimStrings :: class, \ Illuminate \ Fundația \ Http \ Middleware \ ConvertEmptyStringsToNull :: class,]; 

După cum puteți vedea, $ middleware deține gama de middleware care vine cu instalarea implicită a Laravel. Software-ul middleware listat aici va fi executat la fiecare cerere de Laravel și, prin urmare, este un candidat ideal pentru a plasa propriul middleware personalizat.

Continuați și includeți middleware-ul personalizat, după cum se arată în fragmentul următor.

protejat $ middleware = [\ Illuminate \ Foundation \ Http \ Middleware \ CheckForMaintenanceMode :: clasa, \ Illuminate \ Foundation \ Http \ Middleware \ ValidatePostSize :: class \ Http \ Middleware \ ConvertEmptyStringsToNull :: clasă, \ App \ Http \ Middleware \ MobileRedirect :: class,]; 

Acum, încercați să accesați oricare dintre rutele dvs. Laravel cu interogarea de interogare mobile = 1, și care ar trebui să declanșeze codul nostru middleware!

Deci așa trebuie să vă înregistrați middleware-ul care trebuie rulat la fiecare solicitare. Cu toate acestea, uneori doriți să difuzați middleware-ul numai pentru anumite rute. Hai să verificăm cum se obține acest lucru folosind $ routeMiddleware.

În contextul exemplului nostru curent, să presupunem că utilizatorii vor fi redirecționați către un site mobil dacă accesează un anumit traseu pe site-ul dvs. În acest scenariu, nu doriți să includeți middleware-ul dvs. în $ middleware listă.

În schimb, doriți să atașați middleware-ul direct la definiția traseului, după cum se arată mai jos.

Route :: get ('/ hello-world', 'HelloWorldController @ index') -> middleware (\ App \ Http \ Middleware \ MobileRedirect :: class);

De fapt, am putea merge cu un pas mai departe și să creăm un alias pentru middleware-ul nostru, astfel încât să nu trebuiască să folosiți numele claselor inline.

Deschideți fișierul app / HTTP / Kernel.php și căutați $ routeMiddleware care deține mapările de pseudonime către middleware. Să includeți intrarea noastră în această listă, așa cum se arată în fragmentul următor.

protejate $ routeMiddleware = ['auth' => \ Iluminare \ Auth \ Middleware \ Authenticate :: clasa, 'auth.basic' => \ Iluminare \ Auth \ Middleware \ AuthenticateWithBasicAuth :: class, 'bindings' => \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ "\ Routing \ Middleware \ ThrottleRequests :: clasa, 'mobile.redirect' => \ App \ Http \ Middleware \ MobileRedirect :: clasa]; 

Și definiția revizuită a traseului arată așa.

Route :: get ('/ hello-world', 'HelloWorldController @ index') -> middleware ("mobile.redirect");

Și asta e povestea înregistrării middleware-ului cu aplicația Laravel. A fost destul de simplă, nu-i așa??

De fapt, am ajuns la sfârșitul acestui articol și sper că v-ați bucurat de el.

Concluzie

Explorarea conceptului de arhitectură în orice cadru este întotdeauna ceva interesant, și asta am făcut în acest articol, deoarece am explorat middleware-ul în cadrul Laravel.

Începând cu o introducere de bază pentru middleware, ne-am îndreptat atenția asupra temei de a crea un middleware personalizat într-o aplicație Laravel. Și a fost ultima jumătate a articolului care a discutat cum să vă înregistrați un middleware personalizat cu Laravel și aceasta a fost și ocazia de a explora diferitele moduri în care ați putea să vă atașați middleware-ul.

Sperăm că călătoria a fost fructuoasă și că articolul a ajutat să vă îmbogățiți cunoștințele. De asemenea, dacă vrei să vină cu subiecte specifice în articolele viitoare, poți să îmi dai întotdeauna o linie despre asta.

Asta e pentru ziua de azi și nu ezitați să vă trageți întrebările, dacă există, utilizând feedul de mai jos!

Cod