Slik registrerer du og bruker Laravel Service Providers

Hvis du noen gang har kommet over Laravel-rammen, er det svært lite sannsynlig at du ikke har hørt om servicebeholdere og tjenesteleverandører. Faktisk er de ryggraden i Laravel-rammen og gjør alt tungt løft når du starter en forekomst av Laravel-søknad.

I denne artikkelen skal vi få et glimt av hva servicebeholderen handler om, og etter det vil vi diskutere tjenesteleverandøren i detalj. I løpet av denne artikkelen vil jeg også demonstrere hvordan du oppretter en tilpasset tjenesteleverandør i Laravel. Når du har opprettet en tjenesteleverandør, må du også registrere den med Laravel-søknaden for å faktisk bruke den, så vi vil også gå gjennom det.

Det er to viktige metoder, oppstart og registrering, som din tjenesteleverandør kan implementere, og i det siste segmentet i denne artikkelen diskuterer vi disse to metodene grundig..

Før vi dykker inn i diskusjonen fra en tjenesteleverandør, prøver jeg å introdusere servicebeholderen, da den vil bli brukt tungt i implementering av tjenesteleverandøren.

Forstå servicebeholdere og tjenesteleverandører

Hva er en Service Container?

På de enkleste vilkårene kan vi si at servicebeholderen i Laravel er en boks som inneholder ulike komponenters bindinger, og de serveres etter behov gjennom hele søknaden.

I ordene til den offisielle Laravel dokumentasjonen:

Laravel service container er et kraftig verktøy for å administrere klassen avhengigheter og utføre avhengighet injeksjon.

Så når du trenger å injisere en hvilken som helst innebygd komponent eller tjeneste, kan du skrive hint i konstruktøren eller metoden, og det vil bli injisert automatisk fra servicebeholderen da den inneholder alt du trenger! Er det ikke kult? Det sparer deg fra manuelt å instantiere komponentene og unngår dermed stram kobling i koden din.

La oss ta en titt på et raskt eksempel for å forstå det.

Klasse SomeClass offentlig funksjon __construct (FooBar $ foobarObject) // bruk $ foobarObject objekt

Som du kan se, er SomeClass trenger en forekomst av foobar å skape seg selv. Så, i utgangspunktet har den en avhengighet som må injiseres. Laravel gjør dette automatisk ved å se på servicebeholderen og injisere den aktuelle avhengigheten.

Og hvis du lurer på hvordan Laravel vet hvilke komponenter eller tjenester som skal inkluderes i servicebeholderen, er svaret tjenesteleverandøren. Det er leverandøren som forteller Laravel å binde ulike komponenter inn i servicebeholderen. Faktisk kalles det servicebeholderbinding, og du må gjøre det via tjenesteleverandøren.

Så det er tjenesteleverandøren som registrerer alle servicebeholderbindingene, og det gjøres via registermetoden til tjenesteleverandørens gjennomføring.

Det burde ta et annet spørsmål på bordet: Hvordan vet Laravel om ulike tjenesteleverandører? Har du bare sagt noe? Jeg har nettopp hørt noen sier det, Laravel burde finne ut det automatisk også! Oh gutt, det er for mye å spørre: Laravel er et rammeverk ikke en supermann, ikke sant? Å tippe, det er noe du trenger for å informere Laravel eksplisitt.

Gå videre og se på innholdet i config / app.php fil. Du finner en matriseoppføring som viser alle tjenesteleverandørene som skal lastes under oppstart av Laravel-applikasjonen.

'providers' => [/ * * Laravel Framework Service Providers ... * / Illuminate \ Auth \ AuthServiceProvider :: klassen, lyser \ Broadcasting \ BroadcastServiceProvider :: klasse, lyser \ Bus \ BusServiceProvider :: klasse, lyser \ Cache \ CacheServiceProvider :: klasse, lyser \ Foundation \ Providers \ ConsoleSupportServiceProvider :: klassen, Lyser \ Cookie \ CookieServiceProvider :: klassen, lyser \ Database \ DatabaseServiceProvider :: klasse, Lys \ Kryptering \ EncryptionServiceProvider :: klasse, lyser \ Filsystem \ FilesystemServiceProvider :: klasse, Lyser \ Foundation \ Providers \ FoundationServiceProvider :: class, Illuminate \ Hashing \ HashServiceProvider :: klassen, lyser \ Mail \ MailServiceProvider :: klassen, Lyser \ Meldinger \ NotificationServiceProvider :: klassen, Lyser \ Paginering \ PaginationServiceProvider :: klassen, Lyser \ Rørledning \ PipelineServiceProvider :: klasse, Lyser \ Queue \ QueueServiceProvider :: klasse, Lyser \ Redis \ RedisServiceProvider :: klasse, Lyser \ Auth \ Passord \ PasswordResetServiceP rovider :: class, Illuminate \ Session \ SessionServiceProvider :: klassen, lyser \ Oversettelse \ OversettelseServiceProvider :: klasse, Lyser \ Validering \ ValidasjonServiceProvider :: klasse, Lyser \ Vis \ VisServiceProvider :: klasse, / * * Pakkeleverandører ... * / Laravel \ Tinker \ TinkerServiceProvider :: klasse, / * * Applikasjonsleverandører ... * / App \ Providers \ AppServiceProvider :: klasse, App \ Providers \ AuthServiceProvider :: klasse, // App \ Providers \ BroadcastServiceProvider :: klasse, App \ Providers \ EventServiceProvider :: klasse, App \ Providers \ RouteServiceProvider :: klasse,],

Så det var servicebeholderen til din disposisjon. Fra neste avsnitt vil vi fokusere på tjenesteleverandøren, som er hovedtemaet i denne artikkelen!

Hva er en tjenesteleverandør?

Hvis servicebeholderen er noe som gjør at du kan definere bindinger og injisere avhengigheter, er tjenesteleverandøren stedet der det skjer.

La oss få en rask titt på en av kjerne tjenesteleverandørene for å forstå hva det gjør. Gå videre og åpne vender / laravel / rammeverk / src / Illuminate / Cache / CacheServiceProvider.php fil.

offentlige funksjonsregister () $ this-> app-> singleton ('cache', funksjon ($ app) returner ny CacheManager ($ app);); $ this-> app-> singleton ('cache.store', funksjon ($ app) return $ app ['cache'] -> driver ();); $ this-> app-> singleton ('memcached.connector', funksjon () returner ny MemcachedConnector;); 

Det viktige å merke seg her er registrere metode, som lar deg definere service container bindinger. Som du ser, er det tre bindinger for cache, cache.store og memcached.connector tjenester.

I utgangspunktet informerer vi Laravel om at det er behov for å løse en cache oppføring, det bør returnere forekomsten av CacheManager. Så vi legger bare til en slags kartlegging i servicebeholderen som kan nås via $ Dette-> app.

Dette er den riktige måten å legge til noen tjeneste på en Laravel service container. Det gir deg også mulighet til å realisere det større bildet av hvordan Laravel går gjennom registermetoden til alle tjenesteleverandører og fyller servicebeholderen! Og som vi tidligere har nevnt, plukker den opp listen over tjenesteleverandører fra config / app.php fil.

Og det er historien til tjenesteleverandøren. I neste avsnitt drøfter vi hvordan du oppretter en egendefinert tjenesteleverandør, slik at du kan registrere dine egendefinerte tjenester i Laravel-servicebeholderen.

Lag din tilpassede tjenesteleverandør

Laravel kommer allerede med et praktisk kommandolinjeverktøy, håndverker, som lar deg lage malkode slik at du ikke trenger å lage den fra grunnen av. Gå videre og flytt til kommandolinjen og kjør følgende kommando i programroten din for å opprette en tilpasset tjenesteleverandør.

$ php artisan make: leverandør EnvatoCustomServiceProvider Provider opprettet vellykket.

Og det skal opprette filen EnvatoCustomServiceProvider.php under app / Leverandører katalogen. Åpne filen for å se hva den inneholder.

Som vi diskuterte tidligere, er det to metoder, oppstart og registrere, at du skal håndtere det meste av tiden når du jobber med din egendefinerte tjenesteleverandør.

De registrere Metoden er stedet der du definerer alle dine tilpassede service container bindinger. På den annen side, støvel Metode er stedet der du kan konsumere allerede registrerte tjenester via registreringsmetoden. I det siste segmentet i denne artikkelen diskuterer vi disse to metodene i detalj, ettersom vi går gjennom noen praktiske brukstilfeller for å forstå bruken av begge metodene.

Registrer din egendefinerte tjenesteleverandør

Så du har opprettet din egendefinerte tjenesteleverandør. Det er flott! Deretter må du informere Laravel om din egendefinerte tjenesteleverandør, slik at den kan laste den sammen med andre tjenesteleverandører under bootstrapping.

For å registrere tjenesteleverandøren trenger du bare å legge til en oppføring i gruppen av tjenesteleverandører i config / app.php fil.

'providers' => [/ * * Laravel Framework Service Providers ... * / Illuminate \ Auth \ AuthServiceProvider :: klassen, lyser \ Broadcasting \ BroadcastServiceProvider :: klasse, lyser \ Bus \ BusServiceProvider :: klasse, lyser \ Cache \ CacheServiceProvider :: klasse, lyser \ Foundation \ Providers \ ConsoleSupportServiceProvider :: klassen, Lyser \ Cookie \ CookieServiceProvider :: klassen, lyser \ Database \ DatabaseServiceProvider :: klasse, Lys \ Kryptering \ EncryptionServiceProvider :: klasse, lyser \ Filsystem \ FilesystemServiceProvider :: klasse, Lyser \ Foundation \ Providers \ FoundationServiceProvider :: class, Illuminate \ Hashing \ HashServiceProvider :: klassen, lyser \ Mail \ MailServiceProvider :: klassen, Lyser \ Meldinger \ NotificationServiceProvider :: klassen, Lyser \ Paginering \ PaginationServiceProvider :: klassen, Lyser \ Rørledning \ PipelineServiceProvider :: klasse, Lyser \ Queue \ QueueServiceProvider :: klasse, Lyser \ Redis \ RedisServiceProvider :: klasse, Lyser \ Auth \ Passord \ PasswordResetServiceP rovider :: class, Illuminate \ Session \ SessionServiceProvider :: klassen, lyser \ Oversettelse \ OversettelseServiceProvider :: klasse, Lyser \ Validering \ ValidasjonServiceProvider :: klasse, Lyser \ Vis \ VisServiceProvider :: klasse, / * * Pakkeleverandører ... * / Laravel \ Tinker \ TinkerServiceProvider :: klasse, / * * Applikasjonsleverandører ... * / App \ Providers \ AppServiceProvider :: klasse, App \ Providers \ AuthServiceProvider :: klasse, // App \ Providers \ BroadcastServiceProvider :: klasse, App \ Providers \ EventServiceProvider :: klasse, App \ Providers \ RouteServiceProvider :: klasse, App \ Providers \ EnvatoCustomServiceProvider :: klasse,],

Og det er det! Du har registrert tjenesteleverandøren din med Laravels ordning av ting! Men tjenesteleverandøren som vi har opprettet, er nesten en tom mal og har ingen nytte for øyeblikket. I neste avsnitt går vi gjennom et par praktiske eksempler for å se hva du kan gjøre med registeret og oppstartsmetodene.

Gå gjennom Register og Boot Methods

Til å begynne med, går vi gjennom registrere metode for å forstå hvordan du faktisk kunne bruke den. Åpne tjenesteleverandørfilen app / Leverandører / EnvatoCustomServiceProvider.php som ble opprettet tidligere og erstatt den eksisterende koden med følgende.

app-> bind ('App \ Library \ Services \ DemoOne', funksjon ($ app) returner ny DemoOne ();); 

Det er to viktige ting å merke seg her:

  • Vi har importert App \ Library \ Services \ DemoOne slik at vi kan bruke den. De DemoOne klassen er ikke opprettet ennå, men vi gjør det om et øyeblikk.
  • I registreringsmetoden har vi brukt binde Metoden til servicebeholderen for å legge til vår servicebeholderbinding. Så, når App \ Library \ Services \ DemoOne avhengighet må løses, det vil kalle lukkingsfunksjonen, og det instantiates og returnerer App \ Library \ Services \ DemoOne gjenstand.

Så du trenger bare å lage app / Bibliotek / Tjenester / DemoOne.php filen for at dette skal fungere.

Og her er koden et sted i din kontroller hvor avhengigheten vil bli injisert.

doSomethingUseful (); 

Det er et veldig enkelt eksempel på å binde en klasse. Faktisk er det i det ovennevnte eksemplet ikke nødvendig å opprette en tjenesteleverandør og implementere registermetoden som vi gjorde, siden Laravel automatisk kan løse det ved hjelp av refleksjon.

Et svært viktig notat fra Laravel dokumentasjonen:

Det er ikke nødvendig å binde klasser i beholderen hvis de ikke er avhengige av noen grensesnitt. Beholderen trenger ikke å bli instruert om hvordan man bygger disse objektene, siden det automatisk kan løse disse objektene ved hjelp av refleksjon.

På den annen side ville det vært veldig nyttig hvis du hadde bundet et grensesnitt til en bestemt implementering. La oss gå gjennom et eksempel for å forstå det.

La oss lage et veldig enkelt grensesnitt på app / Bibliotek / Tjenester / kontrakter / CustomServiceInterface.php.

Deretter la oss lage to konkrete implementeringer av dette grensesnittet. I utgangspunktet trenger vi bare å lage to klasser som strekker seg CustomServiceInterface grensesnitt.

Opprett DemoOne klasse i app / Bibliotek / Tjenester / DemoOne.php.

på samme måte, DemoTwo går inn app / Bibliotek / Tjenester / DemoTwo.php.

Nå, i stedet for å binde en klasse, binder vi et grensesnitt. revidere EnvatoCustomServiceProvider.php og endre koden som vist nedenfor.

app-> bind ('App \ Library \ Services \ Kontrakter \ CustomServiceInterface', funksjon ($ app) returner ny DemoOne ();); 

I dette tilfellet har vi bundet App \ Library \ Services \ Kontrakter \ CustomServiceInterface grensesnitt til DemoOne gjennomføring. Derfor, når App \ Library \ Services \ Kontrakter \ CustomServiceInterface avhengighet må løses, den instantiates og returnerer App \ Library \ Services \ DemoOne gjenstand. Nå er det mer fornuftig, gjør det ikke?

La oss raskt revidere kontrollerkoden også.

doSomethingUseful (); 

Som du kanskje har gjettet, $ customServiceInstance bør være forekomsten av App \ Library \ Services \ DemoOne! Skjønnheten i denne tilnærmingen er at du kan bytte DemoOne implementering med den andre enkelt.

La oss si at du vil bruke DemoTwo implementering i stedet for DemoOne. I så fall må du bare gjøre følgende endringer i tjenesteleverandøren EnvatoCustomServiceProvider.php.

Finn følgende linje:

bruk App \ Library \ Services \ DemoOne;

Og erstatt den med:

bruk App \ Library \ Services \ DemoTwo;

Tilsvarende finner du denne:

returner ny DemoOne ();

Det bør erstattes av:

returner ny DemoTwo ();

Den samme tilnærmingen kan brukes hvis du ønsker å erstatte noen kjernevirksomhet med din egen. Og det er ikke bare bindemetoden du kan bruke for din servicebeholderbinding; Laravel service container gir ulike måter å binde inn i service container. Vennligst sjekk den officielle Laravel dokumentasjonen for den komplette referansen.

Den neste kandidaten er støvel metode, som du kan bruke til å forlenge kjernen Laravel funksjonalitet. I denne metoden kan du få tilgang til alle tjenestene som ble registrert ved hjelp av registreringsmetoden til tjenesteleverandøren. I de fleste tilfeller vil du registrere hendelseslytterne i denne metoden, som vil bli utløst når noe skjer.

La oss ta en titt på et par eksempler som krever oppstartsmetodeimplementering.

Du vil legge til din egen formularfeltvalidator til Laravel.

offentlig funksjonstart () Validator :: utvide ('my_custom_validator', funksjon ($ attributt, $ verdi, $ parametere, $ validator) // valideringslogikk går her ...); 

Skulle du ønske å registrere en visningskomponist, er det det perfekte stedet å gjøre det! Faktisk kan vi si at oppstartsmetoden ofte brukes til å legge til seekomponister!

offentlig funksjonstart () Vis :: komponist ('demo', 'App \ Http \ ViewComposers \ DemoComposer'); 

Selvfølgelig vil du importere en fasade Belyse \ Support \ Fasader \ Vis i leverandøren din i utgangspunktet.

På samme territorium kan du dele dataene på flere visninger også!

offentlig funksjonstart () Vis :: del ('nøkkel', 'verdi'); 

Det kan også brukes til å definere eksplisitte modellbindinger.

offentlig funksjonstart () foreldre :: boot (); Rute :: modell ('bruker', App \ Bruker :: klasse); 

Disse var noen eksempler for å demonstrere bruken av oppstartsmetoden. Jo mer du kommer inn i Laravel, desto flere grunner vil du finne for å implementere det!

Og med det har vi nådd slutten av denne artikkelen. Jeg håper du har hatt de temaene som ble diskutert gjennom denne artikkelen.

Konklusjon

Det var diskusjonen om tjenesteleverandører som var sentrumsattraksjonen til denne artikkelen, selv om vi startet vår artikkel med servicebeholderen som det var en viktig ingrediens for å forstå tjenesteleverandøren.

Etter dette utviklet vi en tilpasset tjenesteleverandør, og i siste halvdel av artikkelen gikk vi gjennom et par praktiske eksempler.

For de av dere som enten bare er i gang med Laravel eller ønsker å utvide din kunnskap, nettsted eller søknad med utvidelser, har vi en rekke ting du kan studere på Envato Market.

Hvis du har noen spørsmål eller kommentarer, bare skyte den ved hjelp av strømmen nedenfor!