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.
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!
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.
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ørfilenapp / 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:
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.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 iapp / Bibliotek / Tjenester / DemoOne.php
.på samme måte,
DemoTwo
går innapp / 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 tilDemoOne
gjennomføring. Derfor, nårApp \ Library \ Services \ Kontrakter \ CustomServiceInterface
avhengighet må løses, den instantiates og returnererApp \ 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 avApp \ Library \ Services \ DemoOne
! Skjønnheten i denne tilnærmingen er at du kan bytteDemoOne
implementering med den andre enkelt.La oss si at du vil bruke
DemoTwo
implementering i stedet forDemoOne
. I så fall må du bare gjøre følgende endringer i tjenesteleverandørenEnvatoCustomServiceProvider.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!