Se hai mai incontrato il framework di Laravel, è altamente improbabile che tu non abbia mai sentito parlare di contenitori di servizi e fornitori di servizi. In realtà, sono la spina dorsale del framework Laravel e fanno tutto il lavoro pesante quando si avvia un'istanza di qualsiasi applicazione Laravel.
In questo articolo, daremo un'occhiata a ciò che è il contenitore di servizi, e in seguito discuteremo dettagliatamente il fornitore di servizi. Nel corso di questo articolo, dimostrerò anche come creare un fornitore di servizi personalizzati in Laravel. Una volta creato un fornitore di servizi, è necessario registrarlo anche con l'applicazione Laravel per poterlo effettivamente utilizzare, quindi lo esamineremo anche.
Esistono due metodi importanti, l'avvio e la registrazione, che il tuo fornitore di servizi può implementare e nell'ultimo segmento di questo articolo discuteremo a fondo questi due metodi.
Prima di immergerci nella discussione di un fornitore di servizi, cercherò di introdurre il contenitore del servizio poiché verrà utilizzato pesantemente nell'implementazione del provider di servizi.
In termini più semplici, potremmo dire che il container del servizio in Laravel è una casella che contiene i collegamenti di vari componenti e che vengono serviti come necessario in tutta l'applicazione.
Nelle parole della documentazione ufficiale di Laravel:
Il container del servizio Laravel è un potente strumento per gestire le dipendenze delle classi e eseguire l'iniezione delle dipendenze.
Pertanto, ogni volta che è necessario iniettare qualsiasi componente o servizio integrato, è possibile digitare un suggerimento nel costruttore o nel metodo, e verrà iniettato automaticamente dal contenitore del servizio poiché contiene tutto ciò di cui si ha bisogno! Non è bello? Ti evita di istanziare manualmente i componenti e quindi evita l'accoppiamento stretto nel codice.
Diamo un'occhiata ad un rapido esempio per capirlo.
Class SomeClass public function __construct (FooBar $ foobarObject) // usa $ foobarObject oggetto
Come puoi vedere, il SomeClass
ha bisogno di un'istanza di FooBar
istanziare se stesso. Quindi, fondamentalmente, ha una dipendenza che deve essere iniettata. Laravel lo fa automaticamente esaminando il contenitore dei servizi e iniettando la dipendenza appropriata.
E se ti stai chiedendo come Laravel sa quali componenti o servizi includere nel contenitore del servizio, la risposta è il fornitore di servizi. È il fornitore di servizi che comunica a Laravel di legare vari componenti nel contenitore del servizio. In realtà, si chiama binding del contenitore di servizi, e devi farlo tramite il fornitore di servizi.
Quindi è il fornitore di servizi che registra tutti i collegamenti del contenitore di servizi, e viene eseguito tramite il metodo di registrazione dell'implementazione del provider di servizi.
Questo dovrebbe portare un'altra domanda sul tavolo: come fa Laravel a sapere di vari fornitori di servizi? Hai appena detto qualcosa? Ho appena sentito qualcuno dire questo, Laravel dovrebbe capirlo automaticamente anche tu! Oh ragazzo, è troppo chiedere: Laravel è una struttura non un superuomo, non è vero? Scherzi a parte, è qualcosa che devi informare in modo esplicito Laravel.
Vai avanti e guarda il contenuto del config / app.php
file. Troverai una voce dell'array che elenca tutti i fornitori di servizi che verranno caricati durante il bootstrap dell'applicazione Laravel.
'providers' => [/ * * Laravel Framework Service Provider ... * / Illuminate \ Auth \ AuthServiceProvider :: classe, Illuminate \ Broadcasting \ BroadcastServiceProvider :: class, Illuminate \ Bus \ BusServiceProvider :: class, Illuminate \ Cache \ CacheServiceProvider :: classe, Illuminate \ Foundation \ Providers \ ConsoleSupportServiceProvider :: classe, Illuminate \ Cookie \ CookieServiceProvider :: classe, Illuminate \ Database \ DatabaseServiceProvider :: classe, Illuminate \ Encryption \ EncryptionServiceProvider :: classe, Illuminate \ Filesystem \ FilesystemServiceProvider :: classe, Illuminate \ Foundation \ Providers \ FoundationServiceProvider :: classe, Illuminate \ Hashing \ HashServiceProvider :: classe, Illuminate \ Mail \ MailServiceProvider :: classe, Illuminate \ Notifications \ NotificationServiceProvider :: classe, Illuminate \ Pagination \ PaginationServiceProvider :: class, Illuminate \ Pipeline \ PipelineServiceProvider :: class, Illuminate \ Queue \ QueueServiceProvider :: class, Illuminate \ Redis \ RedisServiceProvider :: class, Illuminate \ Auth \ Passwords \ PasswordResetServiceP rovider :: class, Illuminate \ Session \ SessionServiceProvider :: class, Illuminate \ Translation \ TranslationServiceProvider :: class, Illuminate \ Validation \ ValidationServiceProvider :: class, Illuminate \ View \ ViewServiceProvider :: class, / * * Provider di servizi di pacchetti ... * / Laravel \ Tinker \ TinkerServiceProvider :: class, / * * Application Service Provider ... * / App \ Provider \ AppServiceProvider :: classe, App \ Provider \ AuthServiceProvider :: classe, // App \ Provider \ BroadcastServiceProvider :: classe, App \ Provider \ EventServiceProvider :: class, App \ Providers \ RouteServiceProvider :: class,],
Quindi, questo era il contenitore di servizi a tua disposizione. Dalla prossima sezione in poi, ci concentreremo sul fornitore di servizi, che è l'argomento principale di questo articolo!
Se il contenitore del servizio è qualcosa che consente di definire i collegamenti e iniettare le dipendenze, il provider di servizi è il luogo in cui avviene.
Diamo uno sguardo veloce a uno dei principali fornitori di servizi per capire cosa fa. Vai avanti e apri il vender / laravel / quadro / src / Illuminate / cache / CacheServiceProvider.php
file.
registro delle funzioni pubbliche () $ this-> app-> singleton ('cache', function ($ app) return new CacheManager ($ app);); $ this-> app-> singleton ('cache.store', function ($ app) return $ app ['cache'] -> driver ();); $ this-> app-> singleton ('memcached.connector', function () return new MemcachedConnector;);
La cosa importante da notare qui è il Registrare
metodo, che consente di definire i binding del contenitore di servizi. Come puoi vedere, ci sono tre associazioni per il nascondiglio
, cache.store
e memcached.connector
Servizi.
Fondamentalmente, informiamo Laravel che ogni volta che è necessario risolvere un problema nascondiglio
voce, dovrebbe restituire l'istanza di CacheManager
. Quindi stiamo solo aggiungendo un tipo di mappatura nel container del servizio a cui è possibile accedere tramite $ This-> App
.
Questo è il modo corretto per aggiungere qualsiasi servizio a un container del servizio Laravel. Ciò consente anche di comprendere l'immagine più ampia di come Laravel passa attraverso il metodo di registrazione di tutti i fornitori di servizi e popola il contenitore di servizi! E come abbiamo accennato in precedenza, raccoglie l'elenco dei fornitori di servizi dal config / app.php
file.
E questa è la storia del fornitore di servizi. Nella prossima sezione, discuteremo su come creare un fornitore di servizi personalizzato in modo che tu possa registrare i tuoi servizi personalizzati nel container del servizio Laravel.
Laravel è già dotato di uno strumento di utilità da riga di comando pratico, artigiano
, che ti consente di creare il codice del modello in modo da non doverlo creare da zero. Vai avanti e vai alla riga di comando ed esegui il seguente comando nella root dell'applicazione per creare un fornitore di servizi personalizzato.
$ php artisan make: provider EnvatoCustomServiceProvider Provider creato con successo.
E quello dovrebbe creare il file EnvatoCustomServiceProvider.php
sotto il app / fornitori
directory. Apri il file per vedere cosa contiene.
Come abbiamo discusso in precedenza, ci sono due metodi, avvio e registrazione, che dovrai gestire la maggior parte del tempo quando lavori con il tuo fornitore di servizi personalizzati.
Il
Registrare
metodo è il luogo in cui si definiscono tutti i collegamenti del contenitore del servizio personalizzato. D'altra parte, ilavvio
metodo è il luogo in cui è possibile consumare servizi già registrati tramite il metodo di registrazione. Nell'ultimo segmento di questo articolo, discuteremo questi due metodi in dettaglio mentre esamineremo alcuni casi di utilizzo pratico per capire l'utilizzo di entrambi i metodi.Registra il tuo fornitore di servizi personalizzati
Quindi hai creato il tuo fornitore di servizi personalizzati. È fantastico! Successivamente, è necessario informare Laravel del proprio fornitore di servizi personalizzati in modo che possa caricarlo insieme ad altri fornitori di servizi durante il bootstrap.
Per registrare il fornitore di servizi, è sufficiente aggiungere una voce alla serie di fornitori di servizi nel
config / app.php
file.'providers' => [/ * * Laravel Framework Service Provider ... * / Illuminate \ Auth \ AuthServiceProvider :: classe, Illuminate \ Broadcasting \ BroadcastServiceProvider :: class, Illuminate \ Bus \ BusServiceProvider :: class, Illuminate \ Cache \ CacheServiceProvider :: classe, Illuminate \ Foundation \ Providers \ ConsoleSupportServiceProvider :: classe, Illuminate \ Cookie \ CookieServiceProvider :: classe, Illuminate \ Database \ DatabaseServiceProvider :: classe, Illuminate \ Encryption \ EncryptionServiceProvider :: classe, Illuminate \ Filesystem \ FilesystemServiceProvider :: classe, Illuminate \ Foundation \ Providers \ FoundationServiceProvider :: classe, Illuminate \ Hashing \ HashServiceProvider :: classe, Illuminate \ Mail \ MailServiceProvider :: classe, Illuminate \ Notifications \ NotificationServiceProvider :: classe, Illuminate \ Pagination \ PaginationServiceProvider :: class, Illuminate \ Pipeline \ PipelineServiceProvider :: class, Illuminate \ Queue \ QueueServiceProvider :: class, Illuminate \ Redis \ RedisServiceProvider :: class, Illuminate \ Auth \ Passwords \ PasswordResetServiceP rovider :: class, Illuminate \ Session \ SessionServiceProvider :: class, Illuminate \ Translation \ TranslationServiceProvider :: class, Illuminate \ Validation \ ValidationServiceProvider :: class, Illuminate \ View \ ViewServiceProvider :: class, / * * Provider di servizi di pacchetti ... * / Laravel \ Tinker \ TinkerServiceProvider :: class, / * * Application Service Provider ... * / App \ Provider \ AppServiceProvider :: classe, App \ Provider \ AuthServiceProvider :: classe, // App \ Provider \ BroadcastServiceProvider :: classe, App \ Provider \ EventServiceProvider :: class, App \ Providers \ RouteServiceProvider :: class, App \ Providers \ EnvatoCustomServiceProvider :: class,],E questo è tutto! Hai registrato il tuo fornitore di servizi con lo schema di cose di Laravel! Ma il fornitore di servizi che abbiamo creato è quasi un modello vuoto e inutile al momento. Nella prossima sezione, esamineremo un paio di esempi pratici per vedere cosa potresti fare con il registro e i metodi di avvio.
Vai attraverso i metodi di registrazione e avvio
Per cominciare, passeremo attraverso il
Registrare
metodo per capire come si potrebbe effettivamente usarlo. Aprire il file del provider di serviziapp / fornitori / EnvatoCustomServiceProvider.php
è stato creato in precedenza e sostituisce il codice esistente con il seguente.app-> bind ('App \ Library \ Services \ DemoOne', function ($ app) return new DemoOne (););Ci sono due cose importanti da notare qui:
App \ Libreria \ Services \ DemoOne
in modo che possiamo usarlo. Il DemoOne
la classe non è ancora stata creata, ma lo faremo in un momento.legare
metodo del contenitore di servizi per aggiungere il nostro binding del contenitore di servizi. Quindi, ogni volta che il App \ Libreria \ Services \ DemoOne
la dipendenza deve essere risolta, chiamerà la funzione di chiusura e istanzia e restituisce il App \ Libreria \ Services \ DemoOne
oggetto.Quindi devi solo creare il app / Library / Servizi / DemoOne.php
file per farlo funzionare.
Ed ecco il codice da qualche parte nel controller dove verrà iniettata la dipendenza.
doSomethingUseful ();Questo è un esempio molto semplice di associazione di una classe. In effetti, nell'esempio sopra, non è necessario creare un fornitore di servizi e implementare il metodo di registrazione come abbiamo fatto noi, poiché Laravel può risolverlo automaticamente usando la riflessione.
Una nota molto importante dalla documentazione di Laravel:
Non è necessario associare le classi nel contenitore se esse non dipendono da alcuna interfaccia. Il contenitore non ha bisogno di essere istruito su come costruire questi oggetti, poiché può risolvere automaticamente questi oggetti usando il reflection.D'altra parte, sarebbe stato molto utile se avessi legato un'interfaccia a una determinata implementazione. Facciamo un esempio per capirlo.
Creiamo un'interfaccia molto semplice a
app / Library / Servizi / Contratti / CustomServiceInterface.php
.Quindi, creiamo due implementazioni concrete di questa interfaccia. Fondamentalmente, abbiamo solo bisogno di creare due classi che estendano il
CustomServiceInterface
interfaccia.Crea il
DemoOne
classe inapp / Library / Servizi / DemoOne.php
.allo stesso modo,
DemoTwo
entraapp / Library / Servizi / DemoTwo.php
.Ora, invece di collegare una classe, legheremo un'interfaccia. Rivisitare
EnvatoCustomServiceProvider.php
e cambia il codice come mostrato sotto.app-> bind ('App \ Libreria \ Servizi \ Contratti \ CustomServiceInterface', funzione ($ app) return new DemoOne (););In questo caso, abbiamo legato il
App \ Libreria \ Services \ Contratti \ CustomServiceInterface
interfaccia alDemoOne
implementazione. Quindi, ogni volta che ilApp \ Libreria \ Services \ Contratti \ CustomServiceInterface
la dipendenza deve essere risolta, crea un'istanza e restituisce ilApp \ Libreria \ Services \ DemoOne
oggetto. Ora ha più senso, non è così?Riesaminiamo rapidamente anche il codice del controller.
doSomethingUseful ();Come avrai intuito, il
$ customServiceInstance
dovrebbe essere l'istanza diApp \ Libreria \ Services \ DemoOne
! La bellezza di questo approccio è che puoi scambiare ilDemoOne
implementazione con l'altra facilmente.Diciamo che vuoi usare il
DemoTwo
implementazione al posto diDemoOne
. In tal caso, è sufficiente apportare le seguenti modifiche al fornitore di serviziEnvatoCustomServiceProvider.php
.Trova la seguente riga:
utilizzare App \ Library \ Services \ DemoOne;E sostituirlo con:
utilizzare App \ Library \ Services \ DemoTwo;Allo stesso modo, trova questo:
restituisce nuovo DemoOne ();Questo dovrebbe essere sostituito da:
ritorna nuovo DemoTwo ();È possibile utilizzare lo stesso approccio se si desidera sostituire un'implementazione di base con la propria. E non è solo il metodo di bind che puoi usare per i tuoi binding di service container; il container del servizio Laravel fornisce vari modi di associazione nel contenitore del servizio. Si prega di consultare la documentazione ufficiale di Laravel per il riferimento completo.
Il prossimo candidato è il
avvio
metodo, che è possibile utilizzare per estendere la funzionalità principale di Laravel. Con questo metodo, è possibile accedere a tutti i servizi che sono stati registrati utilizzando il metodo di registrazione del fornitore di servizi. Nella maggior parte dei casi, si desidera registrare i listener di eventi in questo metodo, che verrà attivato quando succede qualcosa.Diamo un'occhiata ad un paio di esempi che richiedono l'implementazione del metodo di avvio.
Si desidera aggiungere il proprio validatore del campo modulo personalizzato a Laravel.
funzione pubblica boot () Validator :: extend ('my_custom_validator', function ($ attribute, $ value, $ parameters, $ validator) // logica di validazione va qui ...);Se desideri registrare un view compositore, è il posto perfetto per farlo! In effetti, potremmo dire che il metodo di avvio viene spesso utilizzato per aggiungere i compositori di viste!
funzione pubblica boot () View :: composer ('demo', 'App \ Http \ ViewComposers \ DemoComposer');Certo, vuoi importare una facciata
Illuminare \ Support \ Facciate \ View
nel tuo fornitore di servizi, in primo luogo.Nello stesso territorio, è possibile condividere i dati su più viste!
funzione pubblica boot () View :: share ('key', 'value');Può anche essere usato per definire espliciti collegamenti di modelli.
funzione pubblica boot () parent :: boot (); Route :: model ('user', App \ User :: class);Questi erano alcuni esempi per dimostrare l'uso del metodo di avvio. Più entri in Laravel, più motivi troverai per implementarlo!
E con questo, abbiamo raggiunto la fine di questo articolo. Spero che ti siano piaciuti gli argomenti discussi in questo articolo.
Conclusione
È stata la discussione sui fornitori di servizi che è stata l'attrazione principale di questo articolo, anche se abbiamo iniziato il nostro articolo con il contenitore dei servizi poiché era un ingrediente importante per capire il fornitore di servizi.
In seguito, abbiamo sviluppato un fornitore di servizi personalizzati e nella seconda metà dell'articolo abbiamo analizzato un paio di esempi pratici.
Per quelli di voi che stanno appena iniziando con Laravel o stanno cercando di espandere le vostre conoscenze, il vostro sito o la vostra applicazione con le estensioni, abbiamo una varietà di cose che potete studiare al mercato Envato.
Se hai domande o commenti, semplicemente riprendili usando il feed qui sotto!