Programvare design mønstre er best definert i ordene av Martin Fowler:
Mønstre gir en mekanisme for gjengivelse av designrådgivning i et referanseformat. Programvare design er et massivt emne, og når du står overfor et designproblem, må du kunne fokusere på noe så nær problemet som du kan få.
Koden som bruker designmønstre er lett å forstå, vedlikeholde og utvide. Formålet med denne opplæringen er å fremme fasaden i Laravel.
Ifølge Gang of Fours definisjon, den fasade design mønster er et strukturelt mønster som definerer et forenklet grensesnitt til et mer komplekst delsystem. Mønsteret er basert på å skape et enkelt fasade-grensesnitt foran samlingen av nødvendige logikk og metoder. Fasaden selv opprettholder avhengighetene.
Fasaden er veldig lik den adapter og dekoratør mønstre. Adapteren fungerer som en bro mellom to grensesnitt som ikke er kompatible, mens dekoratøren er mer kompleks og brukes til dynamisk endring av måten objekter oppfører seg på.
Søt syntaks, som Laravel bruker, gjør kode renere og lettere å forstå. Laravel fasader er faktisk den syntaktiske sukker for service sted.
La oss ta en titt på Laravel Facade og måten den fungerer på. De cache
fasaden i Laravel ser slik ut:
php Cache :: get ('key');
Selv om det virker som om det bruker en belastning med statiske metoder, gir Laravel faktisk et grensesnitt til klasser som er tilgjengelige i programmets servicebeholder. Som du sikkert allerede vet, svarer den ovenfor skrevet koden til:
php $ app = app (); $ App-> gjør ( 'cache') -> får ( 'nøkkel');
Laravel fasade lokaliserer objekter i leverandør / Laravel / rammeverk / src / Illuminate / Support / Fasader
mens cache-fasaden er plassert i Cache.php
:
php namespace Illuminate \ Support \ Fasader; klasse Cache strekker fasade / ** * Få det registrerte navnet på komponenten. * * @return string * / beskyttet statisk funksjon getFacadeAccessor () return 'cache';
Når vi bruker cache :: får ( 'nøkkelen')
vi kaller faktisk klassen ovenfor. Sørg for å opprette aliaset til den ovennevnte klassen i config-filen config / app.php
:
php 'aliases' => [// ... 'Cache' => Lyser \ Støtte \ Fasader \ Cache :: klasse,
Aliasene settes opp automatisk av Laravel auto-loader. Angi navnet på klassen til hurtigbufferen skaper konsistens med fasaden. Dette alternativet vil mest sikkert gjøre folk som bruker fasader mer komfortabel med koden din.
Følgende tre metoder er avgjørende for å generere en fasade:
getFacadeAccessor
metode i barneklassen.resolveFacadeInstance
Metoden er ansvarlig for å løse riktig forekomst av tjenesten.Implementeringen av fasadeklassemetoder:
"php // ... offentlig statisk funksjon __callStatic ($ metode, $ args) $ instance = statisk :: getFacadeRoot (); bytte (telle ($ args)) tilfelle 0: returnere $ instans -> $ metode ();
sak 1: returner $ instans -> $ metode ($ args [0]); sak 2: returner $ instans -> $ metode ($ args [0], $ args [1]); sak 3: returner $ instans -> $ metode ($ args [0], $ args [1], $ args [2]); sak 4: returner $ instans -> $ metode ($ args [0], $ args [1], $ args [2], $ args [3]); standard: return call_user_func_array (array ($ forekomst, $ metode), $ args); "
__callStatic
I utgangspunktet kaller IoC Containeren å binde seg med klassen. Den kaller også sin (ikke-statiske) metode ved å bruke bryterhuset via PHP call_user_func_array ()
funksjon, passerer parametervisningen til returobjektet getFacadeRoot ()
metode. De getFacadeRoot ()
Metoden er vist som følger:
php offentlig statisk funksjon getFacadeRoot () retur statisk :: resolveFacadeInstance (statisk :: getFacadeAccessor ());
Og resolveFacadeInstance ()
:
"php beskyttet statisk funksjon resolveFacadeInstance ($ navn) hvis (is_object ($ name)) returnerer $ navn;
hvis (isset (statisk :: $ resolvedInstance [$ navn])) return static: $ resolvedInstance [$ navn]; returnere statisk :: $ resolvedInstance [$ navn] = statisk :: $ app [$ navn]; "
Som vist i siste linje i artikkelen, i resolveFacadeInstance
metode, Laravel returnerer forekomsten av service locator. Fordi lokaliseringen er en ren forekomst av den opprinnelige klassen, konkluderer vi at Laravel-fasaden ikke samsvarer med GoFs fasadmønsterdefinisjon. Det er bare service steder. I motsetning til Laravel-fasaden gjør den virkelige fasaden skrive-testen vanskelig og noen ganger til og med umulig, på grunn av etableringen av hardkodede avhengigheter.
For de som tror at DI via konstruktør er et bedre alternativ enn å bruke Laravel-fasaden, vil jeg gjerne informere deg om at noen ekstra konfigurasjoner kan være inkludert.
Jeg vil lage en sjekkfil Laravel Facade som er ansvarlig for å sjekke om inngangsfilen er en pdf eller ikke. For å gjøre dette må vi først og fremst opprette en Er Pdf
Klasse inn App / MyFacade / IsPdf.php
:
"php namespace App \ MyFacade;
klassen IsPdf privat $ pdf = "\ x25 \ x50 \ x44 \ x46 \ x2D";
offentlig funksjonskontroll ($ file) return (file_get_contents ($ file, false, null, 0, strlen ($ this-> pdf)) === $ this-> pdf)? sant: false; "
For det andre, bind klassen til tjenesteleverandøren. Du vil opprette den nye tjenesteleverandøren, som ligger i App \ Providers \ IsPdfServiceProvider:
"php namespace App \ Providers;
bruk Illuminate \ Support \ Facades \ App; bruk Illuminate \ Support \ ServiceProvider;
klassen IsPdfServiceProvider utvider ServiceProvider / ** * Bootstrap applikasjonstjenestene. * * @return void * / public function boot () //
/ ** * Registrer søknadstjenestene. * * @return void * / public function register () App :: bind ('IsPdf', funksjon () return new \ App \ MyFacade \ IsPdf;);
"
For det tredje, opprett Facade-klassen som en forlengelse av den tidligere nevnte klassen Belyse \ Support \ Fasader \ Fasade
. Du vil opprette klassen som vil bli plassert i App \ Fasader \ IsPdfFacade.php
.
"php namespace App \ Facades; bruk Illuminate \ Support \ Facades \ Facade;
klasse IsPdf utvider fasade beskyttet statisk funksjon getFacadeAccessor () return 'IsPdf'; "Det siste trinnet er å registrere fasaden i config / app.php:
"php / * * Application Service Providers ... * / App \ Providers \ IsPdfServiceProvider :: klasse,
"
Og aliaset:
php 'IsPdf' => App \ Fasader \ IsPdf :: klasse
Gratulerer! Du har vellykket opprettet en Laravel-fasade. Du er velkommen til å teste fasaden ved å bruke noen koder, for eksempel:
php Route :: get ('/', funksjon () IsPdf :: check ('/ files / file.pdf'););
Nå vet vi at Laravel-fasaden gjør det super enkelt å ringe metoder, og det kan virkelig lønne seg ned linjen å injisere de faktiske avhengighetene. Selvfølgelig har Laravel fasade sine egne fordeler og ulemper. Det avhenger av at utvikleren velger det riktige alternativet.
For ytterligere ressurser med Laravel, sørg for å sjekke ut tilbudet på markedet.
Hvem vet, kanskje denne artikkelen vil oppfordre deg til å utvikle rammeverk-agnostisk kode og glem å bruke fasader! Lykke til!