Cos’è Manager
Illuminate\Support\Manager è una classe astratta presente fin da Laravel 4.0. Fornisce la base per costruire facilmente sistemi in cui è possibile alternare più “driver” — per cache, sessioni, mail e altro.
Un “driver” è un backend che espone la stessa interfaccia ma cambia implementazione internamente. Per la sessione, ad esempio, esistono i driver file, cookie, database, redis, e si commuta tramite la chiave driver del file di configurazione.
Come è utilizzato nel framework
Ci sono classi che hanno “Manager” nel nome ma non ereditano daIlluminate\Support\Manager.
Le classi che non estendono
Manager condividono comunque l’idea di base di estendersi tramite extend(). Comprendere il pattern Manager aiuta quindi a capire il funzionamento di tutto il framework.
Meccanismo di base
driver() — ottenere un driver
Chiamandodriver(), il driver viene risolto secondo questi passaggi.
Nel codice sorgente vedi che il nome del metodo viene composto dal nome del driver con Str::studly().
file corrisponde createFileDriver(), al driver my-custom corrisponde createMyCustomDriver().
extend() — registrare un driver personalizzato
Passando aextend() un nome di driver e una closure, puoi registrare un driver personalizzato. L’argomento della closure è l’istanza del container.
extend() collega la closure a $this, quindi all’interno della closure puoi accedere alle proprietà e ai metodi del Manager.
__call — delega al driver di default
La classeManager implementa __call: le chiamate a metodi che non esistono sul Manager stesso vengono automaticamente delegate al driver di default.
SessionManager::get('key') usa direttamente il Manager, ma l’elaborazione effettiva è a carico del driver.
Esempio: implementazione di SessionManager
GuardandoIlluminate\Session\SessionManager si capisce concretamente come si usa Manager.
Usare Manager in un pacchetto proprio
Implementazione di base
Come esempio, creiamo una classe personalizzata che estendeManager per un servizio di notifica.
1
Creare la classe che estende Manager
2
Registrare nel service provider
3
Aggiungere un driver personalizzato
4
Utilizzare
MultipleInstanceManager
Illuminate\Support\MultipleInstanceManager è una classe introdotta in Laravel 10. Mentre Manager gestisce “tipi” di driver, MultipleInstanceManager gestisce più “istanze” con nome.
Differenze rispetto a Manager
Metodi obbligatori
EstendendoMultipleInstanceManager devi implementare tre metodi.
getInstanceConfig() restituisce l’array di configurazione associato al nome. La configurazione deve sempre includere driver (o la chiave indicata da $driverKey).
Flusso di risoluzione
Esempio di implementazione in un pacchetto proprio
Prendiamo come esempio un pacchetto che supporta contemporaneamente più gateway SMS.instance().
Gestione della cache dei driver
Operazioni di cache in Manager
Operazioni di cache in MultipleInstanceManager
Riepilogo
Managergestisce i “tipi” di driver. Implementi i metodicreateXxxDriver()ed estendi conextend()MultipleInstanceManagergestisce le “istanze” di driver per nome. È adatto a pacchetti che richiedono più configurazioni di connessione- Non tutte le classi chiamate
ManagerestendonoIlluminate\Support\Manager.CacheManagereQueueManagersono implementazioni indipendenti
Trait Macroable
Impara come aggiungere metodi personalizzati alle classi esistenti con il trait Macroable.