Cum să vă înregistrați și să utilizați furnizorii de servicii Laravel

Dacă ați întâlnit vreodată cadrul Laravel, este puțin probabil că nu ați auzit de containerele de serviciu și furnizorii de servicii. De fapt, ele sunt coloana vertebrală a cadrului Laravel și fac toată ridicarea greutăților când lansați o instanță a oricărei aplicații Laravel.

În acest articol, vom avea o privire asupra a ceea ce este vorba despre containerul de servicii, iar după aceea vom discuta detaliat furnizorul de servicii. În cursul acestui articol, voi demonstra, de asemenea, cum să creați un furnizor personalizat de servicii în Laravel. Odată ce ați creat un furnizor de servicii, trebuie să îl înregistrați și cu aplicația Laravel pentru ao folosi efectiv, așa că vom trece și prin asta.

Există două metode importante, de boot și de înregistrare, pe care furnizorul dvs. de servicii le poate implementa, iar în ultimul segment al acestui articol vom discuta temeinic aceste două metode.

Înainte de a se arunca cu capul în discuția unui furnizor de servicii, voi încerca să introduc containerul de servicii, deoarece acesta va fi folosit în mod semnificativ în implementarea furnizorului dvs. de servicii.

Înțelegeți containerele de service și furnizorii de servicii

Ce este un container de service?

În termeni simpli, am putea spune că containerul de service din Laravel este o cutie care deține legăturile diferitelor componente și este servită după cum este necesar pe tot parcursul aplicației.

În cuvintele documentației oficiale Laravel:

Containerul de servicii Laravel este un instrument puternic pentru gestionarea dependențelor de clasă și efectuarea injecției de dependență.

Deci, ori de câte ori aveți nevoie să injectați orice componentă sau serviciu încorporat, puteți să-l sugerați în structura sau metoda dvs. și va fi injectat automat din containerul de servicii deoarece conține tot ce aveți nevoie! Nu este așa de cool? Vă salvează de la instanțializarea manuală a componentelor și astfel evități cuplarea strânsă în codul dvs..

Să aruncăm o privire la un exemplu rapid pentru ao înțelege.

Clasa SomeClass funcția publică __construct (FooBar $ foobarObject) // folosiți obiectul $ foobarObject

După cum puteți vedea, SomeClass are nevoie de o instanță foobar să se instanțieze. Deci, practic, are o dependență care trebuie injectată. Laravel face acest lucru în mod automat prin examinarea containerului de serviciu și prin injectarea dependenței corespunzătoare.

Și dacă vă întrebați cum Laravel știe ce componente sau servicii să fie incluse în containerul de serviciu, răspunsul este furnizorul de servicii. Este furnizorul de servicii care îi spune lui Laravel să lege diferitele componente în containerul de serviciu. De fapt, se numește legări pentru containere de serviciu și trebuie să o faceți prin intermediul furnizorului de servicii.

Deci este furnizorul de servicii care înregistrează toate legările containerelor de serviciu și se realizează prin metoda de înregistrare a furnizorului de servicii.

Asta ar trebui să aducă o altă întrebare pe masă: cum știe Laravel despre diverși furnizori de servicii? Ai spus ceva? Tocmai am auzit pe cineva spunând că Laravel ar trebui să-și dea seama și de asta automat! Oh, băieți, e prea mult să întrebi: Laravel este un cadru nu superman, nu-i așa? În afară de asta, trebuie să-l informați în mod explicit pe Laravel.

Du-te și uita-te la conținutul config / app.php fişier. Veți găsi o intrare array care enumeră toți furnizorii de servicii care vor fi încărcați în timpul procesului de bootstrapare al aplicației Laravel.

"furnizori" => [/ * * Furnizori de servicii Laravel-cadru ... * / Illuminate \ Auth \ AuthServiceProvider :: clasă, iluminare \ Broadcasting \ BroadcastServiceProvider :: clasă, iluminare \ Bus \ BusServiceProvider :: class, Illuminate \ Cache \ CacheServiceProvider :: clasa, iluminare \ Foundation \ Providers \ ConsoleSupportServiceProvider :: clasa, Illuminate \ Cookie \ CookieServiceProvider :: clasa, Illuminate \ Database \ DatabaseServiceProvider :: clasa, Illuminate \ Encryption \ EncryptionServiceProvider :: class, Illuminate \ Filesystem \ FilesystemServiceProvider :: class, Illuminate \ Fundația \ Furnizori \ FoundationServiceProvider :: clasă, iluminare \ Hashing \ HashServiceProvider :: clasă, iluminare \ Mail \ MailServiceProvider :: clasă, iluminare \ notificări \ NotificationServiceProvider :: clasă, iluminare \ PipelineServiceProvider :: clasă, iluminare \ Queue \ QueueServiceProvider :: clasă, iluminare \ Redis \ RedisServiceProvider :: clasă, iluminare \ Auth \ parole \ PasswordResetServiceP :: Class, Illuminate \ SessionServiceProvider :: Class, Illuminate \ Translation \ TranslationServiceProvider :: Class, Illuminate \ Validation \ ValidationServiceProvider :: Class, Illuminate \ Vizualizeaza \ ViewServiceProvider :: class, / * * Laravel \ Tinker \ TinkerServiceProvider :: Class, / * * Furnizori de servicii de aplicații ... * / App \ Providers \ AppServiceProvider :: clasă, App \ Providers \ AuthServiceProvider :: class, // App \ Providers \ BroadcastServiceProvider :: class, App \ \ EventServiceProvider :: class, App \ Providers \ RouteServiceProvider :: clasa,],

Asta a fost containerul de serviciu la dispoziția ta. Din următoarea secțiune, ne vom concentra pe furnizorul de servicii, care este subiectul principal al acestui articol!

Ce este un furnizor de servicii?

Dacă containerul de servicii este ceva care vă permite să definiți legăturile și să injectați dependențe, atunci furnizorul de servicii este locul unde se întâmplă.

Să aruncăm o privire rapidă asupra unuia dintre furnizorii principali de servicii pentru a înțelege ce face. Mergeți și deschideți vender / laravel / cadru / src / Illuminate / Cache / CacheServiceProvider.php fişier.

funcția ($ app) returnă noua CacheManager ($ app);); $ this-> app-> singleton ('cache.store', functie ($ app) return $ app ['cache'] -> driver ();); $ this-> app-> singleton ('memcached.connector', function () retur nou MemcachedConnector;); 

Lucrul important pe care trebuie să-l observăm aici este Inregistreaza-te , care vă permite să definiți legăturile pentru containerele de serviciu. După cum puteți vedea, există trei legături pentru ascunzătoare, cache.store și memcached.connector Servicii.

Practic, informăm Laravel că ori de câte ori este nevoie să rezolvăm a ascunzătoare intrare, ar trebui să returneze instanța lui CacheManager. Așa că adăugăm un fel de cartografiere în containerul de servicii care poate fi accesat prin intermediul $ This-> app.

Acesta este modul potrivit de a adăuga orice serviciu la un container de service Laravel. Acest lucru vă permite, de asemenea, să realizați o imagine mai largă a modului în care Laravel trece prin metoda de înregistrare a tuturor furnizorilor de servicii și găzduiește containerul de servicii! Și, după cum am menționat mai devreme, se preia lista furnizorilor de servicii din config / app.php fişier.

Și asta e povestea furnizorului de servicii. În secțiunea următoare, vom discuta cum să creați un furnizor personalizat de servicii, astfel încât să vă puteți înregistra serviciile personalizate în containerul de servicii Laravel.

Creați-vă furnizorul de servicii personalizate

Laravel vine deja cu un instrument utilitar de linie de comandă, artizan, care vă permite să creați codul șablonului, astfel încât să nu trebuiască să îl creați de la zero. Mergeți mai departe și treceți la linia de comandă și executați următoarea comandă din root-ul aplicației pentru a crea un furnizor personalizat de servicii.

$ php artisan make: furnizor EnvatoCustomServiceProvider Provider creat cu succes.

Și asta ar trebui să creeze fișierul EnvatoCustomServiceProvider.php sub app / Furnizori director. Deschideți fișierul pentru a vedea ce păstrează.

Așa cum am discutat mai devreme, există două metode, boot și înregistrare, că veți avea de-a face cu majoritatea timpului atunci când lucrați cu furnizorul de servicii personalizate.

Inregistreaza-te metoda este locul unde definiți toate legăturile dvs. de container personalizat. Pe de altă parte, cizmă metoda este locul unde puteți consuma deja servicii înregistrate prin intermediul metodei de înregistrare. În ultimul segment al acestui articol, vom discuta aceste două metode în detaliu pe măsură ce vom trece prin câteva cazuri practice de utilizare pentru a înțelege utilizarea ambelor metode.

Înregistrați-vă furnizorul de servicii personalizate

Așadar, ați creat furnizorul de servicii personalizat. Grozav! În continuare, trebuie să îl informați pe Laravel despre furnizorul dvs. de servicii personalizat, astfel încât să îl poată încărca împreună cu alți furnizori de servicii în timpul operațiilor de bootstrapping.

Pentru a vă înregistra furnizorul de servicii, trebuie doar să adăugați o intrare la seria de furnizori de servicii din config / app.php fişier.

"furnizori" => [/ * * Furnizori de servicii Laravel-cadru ... * / Illuminate \ Auth \ AuthServiceProvider :: clasă, iluminare \ Broadcasting \ BroadcastServiceProvider :: clasă, iluminare \ Bus \ BusServiceProvider :: class, Illuminate \ Cache \ CacheServiceProvider :: clasa, iluminare \ Foundation \ Providers \ ConsoleSupportServiceProvider :: clasa, Illuminate \ Cookie \ CookieServiceProvider :: clasa, Illuminate \ Database \ DatabaseServiceProvider :: clasa, Illuminate \ Encryption \ EncryptionServiceProvider :: class, Illuminate \ Filesystem \ FilesystemServiceProvider :: class, Illuminate \ Fundația \ Furnizori \ FoundationServiceProvider :: clasă, iluminare \ Hashing \ HashServiceProvider :: clasă, iluminare \ Mail \ MailServiceProvider :: clasă, iluminare \ notificări \ NotificationServiceProvider :: clasă, iluminare \ PipelineServiceProvider :: clasă, iluminare \ Queue \ QueueServiceProvider :: clasă, iluminare \ Redis \ RedisServiceProvider :: clasă, iluminare \ Auth \ parole \ PasswordResetServiceP :: Class, Illuminate \ SessionServiceProvider :: Class, Illuminate \ Translation \ TranslationServiceProvider :: Class, Illuminate \ Validation \ ValidationServiceProvider :: Class, Illuminate \ Vizualizeaza \ ViewServiceProvider :: class, / * * Laravel \ Tinker \ TinkerServiceProvider :: Class, / * * Furnizori de servicii de aplicații ... * / App \ Providers \ AppServiceProvider :: clasă, App \ Providers \ AuthServiceProvider :: class, // App \ Providers \ BroadcastServiceProvider :: class, App \ \ EventServiceProvider :: clasa, App \ Providers \ RouteServiceProvider :: class, App \ Providers \ EnvatoCustomServiceProvider :: clasa,],

Si asta e! V-ați înregistrat furnizorul de servicii cu schema de lucru a lui Laravel! Dar furnizorul de servicii pe care l-am creat este aproape un șablon gol și nu are niciun folos în acest moment. În următoarea secțiune, vom trece prin câteva exemple practice pentru a vedea ce ați putea face cu registrul și metodele de încărcare.

Mergeți prin intermediul metodei de înregistrare și de încărcare

Pentru a începe, vom trece prin Inregistreaza-te pentru a înțelege cum puteați să-l utilizați. Deschideți fișierul furnizorului de servicii app / Furnizori / EnvatoCustomServiceProvider.php care a fost creat mai devreme și înlocuiește codul existent cu următoarele.

app-> bind ('App \ Library \ Services \ DemoOne', funcția ($ app) returnează noua DemoOne ();); 

Există două lucruri importante pe care trebuie să le menționăm aici:

  • Am importat App \ Biblioteca \ Services \ DemoOne astfel încât să putem folosi. DemoOne clasa nu este creată încă, dar vom face asta într-un moment.
  • În metoda de înregistrare, am folosit lega metoda containerului de serviciu pentru a adăuga legătura noastră cu containerele de serviciu. Deci, ori de câte ori App \ Biblioteca \ Services \ DemoOne dependența trebuie rezolvată, se va numi funcția de închidere și instanțiază și returnează App \ Biblioteca \ Services \ DemoOne obiect.

Deci, trebuie doar să creați app / Library / Servicii / DemoOne.php fișier pentru ca aceasta să funcționeze.

Iată codul undeva în controlerul unde va fi injectată dependența.

doSomethingUseful (); 

Acesta este un exemplu foarte simplu de legare a unei clase. De fapt, în exemplul de mai sus, nu este nevoie să creați un furnizor de servicii și să implementați metoda de înregistrare așa cum am făcut-o, deoarece Laravel o poate rezolva automat folosind reflecția.

O notă foarte importantă din documentația Laravel:

Nu este nevoie să legeți clasele în container dacă nu depind de interfețe. Containerul nu trebuie să fie instruit cu privire la modul de a construi aceste obiecte, deoarece poate rezolva automat aceste obiecte folosind reflecția.

Pe de altă parte, ar fi fost foarte util dacă ați fi legat o interfață cu o anumită implementare. Să trecem printr-un exemplu pentru a înțelege acest lucru.

Să creați o interfață foarte simplă la app / Library / servicii / Contracte / CustomServiceInterface.php.

Apoi, să realizăm două implementări concrete ale acestei interfețe. Practic, trebuie doar să creați două clase care să extindă CustomServiceInterface interfață.

Creați DemoOne clasă în app / Library / Servicii / DemoOne.php.

asemănător, DemoTwo merge in app / Library / Servicii / DemoTwo.php.

Acum, în loc să legăm o clasă, vom lega o interfață. Revedeți EnvatoCustomServiceProvider.php și modificați codul după cum se arată mai jos.

app-> bind ("App \ Library \ Services \ Contracte \ CustomServiceInterface", funcția ($ app) returnează noua DemoOne ();); 

În acest caz, am legat-o App \ Biblioteca \ Servicii \ Contracte \ CustomServiceInterface interfață cu DemoOne punerea în aplicare. Prin urmare, ori de câte ori App \ Biblioteca \ Servicii \ Contracte \ CustomServiceInterface dependența trebuie rezolvată, instanțiază și returnează App \ Biblioteca \ Services \ DemoOne obiect. Acum are sens, nu-i așa??

Să revizuim rapid și codul de comandă.

doSomethingUseful (); 

După cum probabil ați ghicit, $ customServiceInstance ar trebui să fie instanța lui App \ Biblioteca \ Services \ DemoOne! Frumusețea acestei abordări este că puteți schimba DemoOne punerea în aplicare cu ușurință cu cealaltă.

Să presupunem că doriți să utilizați DemoTwo punerea în aplicare în loc de DemoOne. În acest caz, trebuie doar să efectuați următoarele modificări în furnizorul de servicii EnvatoCustomServiceProvider.php.

Găsiți următoarea linie:

utilizați App \ Library \ Services \ DemoOne;

Și înlocuiți-l cu:

utilizați App \ Library \ Services \ DemoTwo;

În mod similar, găsiți aceasta:

returnați noua DemoOne ();

Acest lucru ar trebui înlocuit cu:

returnați noul DemoTwo ();

Aceeași abordare poate fi utilizată dacă doriți să înlocuiți orice implementare de bază cu cea proprie. Și nu este doar metoda de legare pe care ați putea să o utilizați pentru legarea containerelor de serviciu; containerul de service Laravel oferă diverse modalități de legare în containerul de serviciu. Verificați documentația oficială Laravel pentru o referință completă.

Următorul candidat este cizmă , pe care ați putea folosi pentru a extinde funcționalitatea Laravel de bază. În această metodă, puteți accesa toate serviciile care au fost înregistrate utilizând metoda înregistrării furnizorului de servicii. În cele mai multe cazuri, doriți să înregistrați ascultătorii evenimentului în această metodă, care va fi declanșată atunci când se întâmplă ceva.

Să aruncăm o privire la câteva exemple care necesită implementarea metodei de încărcare.

Doriți să adăugați propriul validator de câmp de formular personalizat la Laravel.

public function boot () Validator :: extend ('my_custom_validator', functie ($ atribut, $ value, $ parameters, $ validator) logica validarii merge aici ...); 

Dacă doriți să înregistrați un compozitor de vizualizare, este locul perfect pentru a face asta! De fapt, am putea spune că metoda de încărcare este frecvent utilizată pentru a adăuga compozitorii de vizualizare!

funcția publică funcția () View :: compozitor ('demo', 'App \ Http \ ViewComposers \ DemoComposer'); 

Desigur, vrei să imporți o fațadă Illuminate \ Suport \ Fațade \ View în furnizorul dvs. de servicii, în primul rând.

Pe același teritoriu, puteți să distribuiți datele și în mai multe vizionări!

funcția publică boot () View :: share ('cheie', 'valoare'); 

Poate fi folosit și pentru a defini legăturile modelului explicit.

funcția publică de boot () parent :: boot (); Route :: model ('user', App \ User :: class); 

Acestea au fost câteva exemple pentru a demonstra utilizarea metodei de încărcare. Cu cât intri mai mult în Laravel, cu atât mai multe motive îl vei găsi pentru ao implementa!

Și cu asta, am ajuns la sfârșitul acestui articol. Sper că v-ați bucurat de subiectele discutate în acest articol.

Concluzie

Discuția furnizorilor de servicii a reprezentat atracția centrală a acestui articol, deși am început articolul cu containerul de servicii, deoarece acesta era un ingredient important pentru a înțelege furnizorul de servicii.

După aceea, am dezvoltat un furnizor de servicii personalizate, iar în a doua jumătate a articolului am trecut prin câteva exemple practice.

Pentru cei care sunteți fie doar începând cu Laravel, fie căutați să vă extindeți cunoștințele, site-ul sau aplicația cu extensii, avem o varietate de lucruri pe care le puteți studia la Envato Market.

Dacă aveți întrebări sau comentarii, înregistrați-l doar utilizând feedul de mai jos!

Cod