Mjukvarutesignmönster definieras bäst av Martin Fowlers ord:
Mönster ger en mekanism för att göra designrådgivning i referensformat. Programvarukonstruktion är ett massivt ämne, och när du står inför ett designproblem måste du kunna fokusera på något så nära problemet som du kan få.
Koden som använder designmönster är lätt att förstå, underhålla och förlänga. Syftet med denna handledning är att främja fasaden i Laravel.
Enligt Gang of Fours definition, den Fasad designmönster är ett strukturellt mönster som definierar ett förenklat gränssnitt till ett mer komplext delsystem. Mönstret är baserat på att skapa ett enkelt fasadgränssnitt framför insamlingen av nödvändig logik och metoder. Fasaden själv behåller beroendet.
Fasaden är mycket lik den adapter och dekoratör mönster. Adaptern fungerar som en bro mellan två gränssnitt som inte är kompatibla, medan dekoratorn är mer komplex och används för att dynamiskt förändra hur föremål beter sig.
Söt syntax, som Laravel använder, gör kodskränare enklare att förstå. Laravel fasader är faktiskt det syntaktiska sockret för service plats.
Låt oss ta en titt på Laravelfasaden och hur den fungerar. De cache
fasaden i Laravel ser ut så här:
php Cache :: get ('key');
Även om det verkar som om det använder en mängd statiska metoder, ger Laravel faktiskt ett gränssnitt till klasser som finns tillgängliga i programmets servicebehållare. Som du förmodligen redan vet, motsvarar den ovan skrivna koden:
php $ app = app (); $ App> göra (cache) -> få ( 'nyckel');
Laravel fasad lokaliserar föremål i leverantör / laravel / ram / src / Illuminate / Support / Fasader
medan cachefasaden är placerad i Cache.php
:
php namespace Illuminate \ Support \ Fasader; klass Cache utökar fasad / ** * Hämta det registrerade namnet på komponenten. * * @returnsträng * / skyddad statisk funktion getFacadeAccessor () return 'cache';
När vi använder cache :: få ( 'nyckel')
vi kallar faktiskt klassen ovan. Se till att skapa alias för ovan nämnda klass i config-filen config / app.php
:
php 'aliases' => [// ... 'Cache' => Belysa \ Support \ Fasader \ Cache :: klass,
Aliaserna ställs in automatiskt av Laravel auto-loader. Att ställa in klassens namn till cacheminne skapar konsekvens med fasaden. Det här alternativet kommer säkerligen att göra folk som använder fasader bekvämare med din kod.
Följande tre metoder är avgörande för att generera en fasad:
getFacadeAccessor
metod i barnklassen.resolveFacadeInstance
Metoden är ansvarig för att lösa rätt exemplar av tjänsten.Genomförandet av fasadklassmetoderna:
"php // ... statisk statisk funktion __callStatic ($ metod, $ args) $ instance = statisk :: getFacadeRoot (); switch (räkna ($ args)) fall 0: return $ instance -> $ method ();
fall 1: returnera $ instans -> $ metod ($ args [0]); fall 2: returnera $ instans -> $ metod ($ args [0], $ args [1]); fall 3: returnera $ instans -> $ metod ($ args [0], $ args [1], $ args [2]); fall 4: returnera $ instans -> $ metod ($ args [0], $ args [1], $ args [2], $ args [3]); standard: return call_user_func_array (array ($ instance, $ method), $ args); "
__callStatic
i princip kallar IoC Container att binda med klassen. Den kallar också sin (icke-statiska) metod genom att använda växelväskan via PHP call_user_func_array ()
funktion, passerar parametrarna till det återkommande objektet getFacadeRoot ()
metod. De getFacadeRoot ()
Metoden visas enligt följande:
php offentliga statiska funktion getFacadeRoot () return static :: resolveFacadeInstance (static :: getFacadeAccessor ());
Och den resolveFacadeInstance ()
:
"php-skyddad statisk funktion resolveFacadeInstance ($ name) om (is_object ($ name)) returnerar $ namn;
om (isset (statisk :: $ resolvedInstance [$ name])) return static> $ resolvedInstance [$ name]; returnera statisk :: $ resolvedInstance [$ name] = statisk :: $ app [$ namn]; "
Som presenteras i den sista raden i artikeln, i resolveFacadeInstance
metod returnerar Laravel förekomsten av service locatorn. Eftersom locatorn är en ren instans av den ursprungliga klassen, konstaterar vi att Laravel-fasaden inte överensstämmer med GoFs fasadmönsterdefinition. Det är bara serviceplatser. Till skillnad från Laravel fasaden gör den verkliga fasaden att skriva enhetsprov svår och ibland till och med omöjlig, på grund av skapandet av hårdkodade beroende.
För dem som tror att DI via konstruktör är ett bättre alternativ än att använda Laravel fasad, skulle jag vilja informera dig om att en viss extra konfiguration kan inkluderas.
Jag vill skapa en kontrollfil Laravel Facade som är ansvarig för att kontrollera om inmatningsfilen är en pdf eller ej. För att göra detta måste vi först och främst skapa en Är Pdf
Klass i App / MyFacade / IsPdf.php
:
"php namespace App \ MyFacade;
klassen IsPdf privat $ pdf = "\ x25 \ x50 \ x44 \ x46 \ x2D";
public function check ($ file) return (file_get_contents ($ file, false, null, 0, strlen ($ this-> pdf)) === $ this-> pdf)? sant falskt; "
För det andra, bind klassen till tjänsteleverantören. Du kommer att skapa den nya tjänsteleverantören, som kommer att finnas i App \ Providers \ IsPdfServiceProvider:
"php namespace App \ Providers;
använd Belysa \ Support \ Fasader \ App; använd Illuminate \ Support \ ServiceProvider;
klassen IsPdfServiceProvider utökar ServiceProvider / ** * Bootstrap applikationstjänsterna. * * @return void * / public function boot () //
/ ** * Registrera applikationstjänsterna. * * @return void * / public function register () App :: bind ('IsPdf', funktion () returnera nytt \ App \ MyFacade \ IsPdf;);
"
För det tredje, skapa fasadklassen, som en förlängning av den tidigare nämnda klassen Illuminate \ Support \ Fasader \ Facade
. Du kommer att skapa klassen som kommer att ligga i App \ Fasader \ IsPdfFacade.php
.
"php namespace App \ Fasader, använd Illuminate \ Support \ Fasader \ Fasad;
klassen IsPdf utökar fasad skyddad statisk funktion getFacadeAccessor () returnera 'IsPdf'; "Det sista steget är att registrera fasaden i config / app.php:
"php / * * Application Service Providers ... * / App \ Providers \ IsPdfServiceProvider :: klass,
"
Och aliaset:
php 'IsPdf' => App \ Fasader \ IsPdf :: klass
grattis! Du har lyckats skapa en Laravel fasad. Testa facaden genom att använda vissa koder, till exempel:
php Route :: get ('/', funktion () IsPdf :: check ('/ files / file.pdf'););
Nu vet vi att Laravel-fasaden gör det super lätt att ringa metoder, och att injicera de faktiska beroenden kan verkligen betala ner linjen. Givetvis har Laravel fasad sina egna fördelar och nackdelar. Det beror på att utvecklaren väljer rätt alternativ.
För ytterligare resurser med Laravel, se till att kolla erbjudandet på marknaden.
Vem vet, kanske den här artikeln kommer att uppmuntra dig att utveckla ramar-agnostisk kod och glömma att använda fasader! Lycka till!