I Service Provider sono il perno del boot in tutte le applicazioni Laravel, di conseguenza rappresentano l’entry point per estendere il framework con funzionalità personalizzate.
Tutti i Service Provider sono registrati nel file config/app.php all’interno dell’array providers.
Quando un fornitore di servizi viene registrato, Laravel richiama automaticamente il metodo register() della classe. Inoltre, i Service Provider possono sfruttare il metodo boot() che viene invocato durante il processo di bootstrap.
Una volta avviato, il fornitore di servizi rimane attivo per tutta la durata della richiesta.
Laravel offre la possibilità di utilizzare diversi Service Provider che sono responsabili di una parte specifica dell’applicazione. Ad esempio, la classe AuthServiceProvider si occupa dell’autenticazione degli utenti, la classe EventServiceProvider definisce eventi e relativi listeners e RouteServiceProvider che definisce i percorsi HTTP.
Oltre a questi Service Provider principali, ovviamente ne possiamo creare degli altri.
Creare un Service Provider personalizzato
Se vogliamo registrare il nostro Service Provider personalizzato, possiamo farlo facilmente seguendo alcune semplici convenzioni.
Quando si crea un nuovo provider tramite la CLI Artisan, esso sarà collocato nella directory app/Providers:
php artisan make:provider MyServiceProvider
Se diamo un’occhiata alla classe appena generata, noteremo che contiene un metodo register() e un metodo boot(). Il metodo register() deve essere utilizzato per legare le funzionalità al provider dopo che questo è stato avviato. Quindi, se abbiamo una funzionalità che non dipende da altri Provider, la dobbiamo dichiarare all’interno di questo metodo.
Il metodo boot(), invece, viene eseguito subito dopo che tutti i Service Provider sono stati registrati, quindi, in questo metodo abbiamo accesso a tutto ciò che è stato elaborato durante la fase di avvio dell’applicazione.
All’interno di ogni Service Provider abbiamo accesso alla proprietà $app che a sua volta ci fornisce l’accesso al Service Container principale del framework. Attraverso questa proprietà, nel metodo register(), possiamo legare le nostre classi personalizzate al framework con una sintassi del genere.
public function register()
{
$this->app->bind('limitless', function () {
return new Limitless();
});
}
Ora non preoccupiamoci se qualche concetto non risulta chiarissimo, perchè mano a mano che andremo avanti con questa guida, tutti i dubbi verranno risolti. Per adesso ricordiamoci questi concetti:
- Un Service Providers inietta funzionalità nel framework
- Il metodo register() va usato quando la funzionalità non è legata ad altri providers
- Il Service Provider contiene la proprietà $app che è l’istanza stessa del framework
A questi tre concetti aggiungo solo una piccola anticipazione: Nel metodo register() abbiamo usato la sintassi tipica per bindare una Facade, altro tema importante di Laravel. Nel prossimo capitolo vedremo di che cosa si tratta.