Care sunt Laravel 5.0 Fasade?

Modelele de design software sunt cel mai bine definite în cuvintele lui Martin Fowler:

Modelele oferă un mecanism de acordare a recomandărilor de proiectare într-un format de referință. Proiectarea de software este un subiect masiv, iar atunci când se confruntă cu o problemă de design, trebuie să vă puteți concentra pe ceva cât mai aproape de problemă pe care o puteți obține.

Codul care utilizează modelele de design este ușor de înțeles, menținut și extins. Scopul acestui tutorial este de a promova fațada din Laravel.

Care este modelul de fațadă?

Conform definiției lui Gang de Patru, faţadă modelul de design este un model structural care definește o interfață simplificată cu un subsistem mai complex. Modelul se bazează pe crearea unei interfețe simple de fațadă în fața colecției de logică și metode necesare. Fațada însăși menține dependențele.

Fatada este foarte asemănătoare cu adaptor și decorator modele. Adaptorul acționează ca o punte între două interfețe care nu sunt compatibile, în timp ce decoratorul este mai complex și folosit pentru a schimba dinamic modul în care se comportă obiectele.

Care sunt fatadele Laravel?

Sintaxa dulce, utilizată de Laravel, face scrierea codului mai curată și mai ușor de înțeles. Laradeelurile Laravel sunt de fapt zahărul sintactic pentru locația de serviciu.

Să aruncăm o privire la fațada Laravel și modul în care funcționează. ascunzătoare fațada din Laravel arată astfel:

php Cache :: obține ('cheie'); Deși s-ar putea să pară că utilizează o mulțime de metode statice, Laravel oferă de fapt o interfață cu clasele care sunt disponibile în containerul de servicii al aplicației. După cum probabil știți deja, codul de mai sus este echivalent cu:

php $ app = app (); $ App-> face ( 'cache') -> get ( 'cheie');

Fatada lui Laravel localizează obiecte în furnizor / Laravel / cadru / src / Illuminate / Suport / Fațade în timp ce este plasată fațada cache Cache.php:

php spațiu de nume Iluminare \ Suport \ Fațade; clasa Cache extinde Faza / ** * Obține numele înregistrat al componentei. * * @ string retur * / funcția statică protejată getFacadeAccessor () return 'cache';

Când o folosim cache :: get ( 'cheie') suntem, de fapt, sunând la clasa de mai sus. Asigurați-vă că ați creat aliasul clasei menționate mai sus în fișierul de configurare config / app.php:

php 'aliases' => [// ... 'Cache' => Iluminare \ Suport \ Fataje \ Cache :: clasa,

Aliasurile sunt configurate automat de încărcătorul auto Laravel. Setarea numelui clasei în cache creează coerența cu fațada. Această opțiune va face cu siguranță utilizatorii care utilizează fațadele mai confortabile cu codul dvs..

Următoarele trei metode sunt esențiale pentru generarea unei Fațade:

  • __callStatic () PHP metoda magică, care este definită ca getFacadeAccessor în clasa copilului.
  • Radacina de fațadă, care reprezintă clasa de bază pe care se bazează metodele de fațadă.
  • resolveFacadeInstance metoda este responsabilă pentru soluționarea instanței corespunzătoare a serviciului.

Implementarea metodelor clasei de fațadă:

"php // ... funcția publică statică __callStatic ($ method, $ args) $ instanță = statică :: getFacadeRoot (); comutare (count ($ args)) caz 0: return $ $ instanță -> $ method;

 cazul 1: returnați instanța $ -> metoda $ ($ args [0]); cazul 2: returnați $ instance -> metoda $ ($ args [0], $ args [1]); cazul 3: returnați $ instance -> metoda $ ($ args [0], $ args [1], $ args [2]); cazul 4: returnați $ instance -> metoda $ ($ args [0], $ args [1], $ args [2], $ args [3]); implicit: return call_user_func_array (array ($ instanță, metoda $), $ args);  "

__callStatic solicită în principiu containerul IoC să se lege de clasă. De asemenea, se numește metoda sa (non-statică) prin utilizarea casetei de comutare prin PHP call_user_func_array () funcția, trecând matricea parametrilor obiectului returnat getFacadeRoot () metodă. getFacadeRoot () metoda este prezentată după cum urmează:

php funcția publică statică getFacadeRoot () return statică :: resolveFacadeInstance (static :: getFacadeAccessor ());

Si resolveFacadeInstance ():

"funcția statică protejată php resolveFacadeInstance ($ name) if (is_object ($ name)) returnează $ name;

dacă (isset (static :: $ resolvedInstance [$ name])) retur static :: $ resolvedInstance [$ name];  retur static :: $ resolvedInstance [$ name] = static :: $ app [$ name]; “

Așa cum este prezentat în ultimul rând al articolului, în resolveFacadeInstance , Laravel returnează instanța locatorului de servicii. Deoarece locatorul este o instanță pură a clasei originale, concluzionăm că fațada Laravel nu se potrivește cu definiția modelului de fațadă al GoF. Acestea sunt doar locațiile de servicii. Spre deosebire de fațada Laravel, Real Facade face testele unității de scriere dificile și uneori chiar imposibile, datorită creării dependențelor codate greu.

Pentru cei care cred că DI prin constructor este o opțiune mai bună decât utilizarea fațadei Laravel, aș dori să vă informez că pot fi incluse unele configurații suplimentare.

Cum se creează fațada Laravel

Vreau să creez un fișier de control Laravel Facade, care este responsabil pentru verificarea dacă fișierul de intrare este un pdf sau nu. Pentru a face acest lucru, mai întâi trebuie să creați un Este Pdf Clasă în App / MyFacade / IsPdf.php:

"spațiul de nume php App \ MyFacade;

clasa IsPdf privată $ pdf = "\ x25 \ x50 \ x44 \ x46 \ x2D";

verificarea funcției publice (fișierul $) return (file_get_contents ($ file, false, null, 0, strlen ($ this-> pdf)) === $ this-> pdf)? adevarat fals;  "

În al doilea rând, obligați clasa la furnizorul de servicii. Veți crea noul furnizor de servicii, care va fi localizat în App \ Furnizori \ IsPdfServiceProvider:

"spațiu de nume php App \ Providers;

utilizați Iluminare \ Suport \ Ferestre \ Aplicație; utilizați Iluminare \ Suport \ ServiceProvider;

clasa IsPdfServiceProvider extinde ServiceProvider / ** * Bootstrap serviciile de aplicație. * * @return void * / boot funcțional public () //

/ ** * Înregistrați serviciile de aplicație. * * @return void * / registru funcțional public () App :: bind ('IsPdf', funcția () return new \ App \ MyFacade \ IsPdf;);  

"

În al treilea rând, creați clasa de fațadă, ca extensie a clasei menționate anterior Illuminate \ Suport \ Fațade \ Fatade . Veți crea clasa care va fi localizată în App \ Fațade \ IsPdfFacade.php.

"spațiu de nume php App \ Fades; utilizați Illuminate \ Support \ Facades \ Facade;

clasa IsPdf extinde Faza funcția statică protejată getFacadeAccessor () return 'IsPdf'; "Ultimul pas este înregistrarea fatadei în config / app.php:

"php / * * Furnizori de servicii de aplicații ... * / App \ Providers \ IsPdfServiceProvider :: class,

"

Și aliasul:

php 'IsPdf' => App \ Facades \ IsPdf :: clasa

Felicitări! Ați creat cu succes o fațadă Laravel. Simțiți-vă liber să testați Fața utilizând unele coduri, cum ar fi:

php Route :: obține ('/', funcția () IsPdf :: check ('/ files / file.pdf'););

Concluzie

Acum, știm că fațada Laravel face foarte ușor să apelezi la metode, iar injectarea dependențelor reale ar putea să-ți plătească cu adevărat. Desigur, Laravel Facade are propriile sale avantaje și dezavantaje. Depinde de dezvoltator pentru a selecta opțiunea potrivită.

Pentru resurse suplimentare cu Laravel, asigurați-vă că ați verificat oferta de pe piață.

Cine știe, poate că acest articol vă va încuraja să dezvoltați codul-cadru agnostic și să uitați despre utilizarea fațadelor! Mult noroc!

Cod