ServiceProvider di Laravel 13 e spiega come mantenere la configurazione come API pubblica del pacchetto. Presuppone la conoscenza dei fondamenti dello sviluppo di pacchetti e, per verificare l’implementazione, usa laravel/framework alla versione v13.34.0.
Pubblicazione e merge sono operazioni distinte
publishes() registra il percorso di origine e quello di destinazione della copia. Finché vendor:publish non copia il file, la directory config dell’utente non cambia. mergeConfigFrom(), invece, aggiorna il repository di configurazione all’avvio senza modificare il file stesso.
register().
mergeConfigFrom() unisce solo il livello superiore
ServiceProvider::mergeConfigFrom() esegue array_merge() passando prima la configurazione del pacchetto e poi quella già esistente nell’applicazione. A parità di chiave stringa, prevale il valore dell’applicazione.
L’esempio seguente riproduce il merge del framework usando solo array.
enabled viene aggiunta, ma transport viene sostituito per intero. transport.retries non viene mantenuto. Il punto importante è che, se l’utente ha già pubblicato un vecchio array transport, le nuove chiavi che aggiungi a quello stesso array non vengono integrate.
Integrare la configurazione annidata con replaceConfigRecursivelyFrom()
IlServiceProvider di Laravel 13 offre anche il metodo protected replaceConfigRecursivelyFrom(). Questo esegue array_replace_recursive() con lo stesso ordine di argomenti.
Se vuoi un’API di configurazione in cui le chiavi stringa annidate si sovrascrivono singolarmente, modifica il register() del provider come segue. Non serve usarlo insieme al mergeConfigFrom() visto prima per la stessa chiave di configurazione.
$defaults e $overrides di prima, il risultato è il seguente.
replaceConfigRecursivelyFrom() è un metodo presente nel codice sorgente di Laravel 13 esaminato in questa pagina. Distinguilo da mergeConfigFrom(), presentato nella documentazione ufficiale sullo sviluppo di pacchetti, e usalo dopo aver verificato l’implementazione del framework corrispondente.Le liste con chiavi numeriche non vengono sostituite per intero
La sostituzione ricorsiva non è un’operazione che “rimpiazza l’intero array con i valori dell’utente”. Anche con chiavi numeriche sostituisce i valori alla stessa chiave e mantiene le chiavi che l’utente non ha specificato.['slack'], database rimane. Inoltre, passando ['channels' => []] la lista di default non diventa vuota. Fai particolare attenzione con configurazioni in cui conta specificare l’intera lista, come destinazioni delle notifiche o middleware.
Se hai configurazioni di questo tipo, valuta la struttura stessa della configurazione, ad esempio separando le liste e gli array associativi sovrascrivibili in parte in chiavi di primo livello diverse e usando il merge superficiale. Se cambi la strategia di merge in un pacchetto già pubblicato, lo stesso file di configurazione si comporterà in modo diverso, quindi non trattarla come una semplice sostituzione dell’implementazione.
La cache della configurazione salva i valori dopo il merge
Entrambi i metodi saltano il merge quando l’applicazione implementaCachesConfiguration e configurationIsCached() restituisce true. In una normale applicazione Laravel, questo accade negli avvii in cui esiste la cache della configurazione.
ConfigCacheCommand elimina la vecchia cache della configurazione, avvia una nuova applicazione e ottiene l’intero repository di configurazione. Durante quell’avvio la configurazione dei provider viene unita e il risultato viene salvato nel file di cache. Negli avvii successivi LoadConfiguration legge quei valori.
Di conseguenza, anche se aggiorni il pacchetto e cambiano i valori di default o la strategia di merge, le modifiche non si riflettono sulle applicazioni che continuano a usare la vecchia cache. Nei deploy che usano la cache della configurazione, ricostruiscila con il codice aggiornato.
php artisan config:clear. Non decidere autonomamente dove generare la cache e lascia che siano i comandi di Laravel a gestirla.
Verifiche prima di rilasciare modifiche alla configurazione
Nei test del pacchetto considera come input non solo la configurazione non pubblicata, ma anche quella rimasta dalle versioni precedenti.- Anche senza configurazione pubblicata, ottieni i valori di default necessari.
- Con una vecchia configurazione pubblicata, i valori dell’utente hanno la precedenza e le nuove voci vengono integrate come previsto.
- Il contratto di sovrascrittura non cambia per array annidati, liste con chiavi numeriche e array vuoti.
config:cacheva a buon fine nell’applicazione che usa il pacchetto e un altro avvio che usa la cache produce la stessa configurazione.
Pagine correlate
Test dei pacchetti
Registra il service provider e verifica il comportamento della configurazione e dei servizi.
Gestione della compatibilità delle versioni
Collega le modifiche all’API pubblica alla politica di rilascio e alla manutenzione continua.
Fonti primarie consultate
- Documentazione ufficiale di Laravel: configurazione dei pacchetti
- ServiceProvider: implementazione di merge e pubblicazione
- ConfigCacheCommand: generazione della cache della configurazione
- LoadConfiguration: caricamento della configurazione
- ConfigClearCommand: eliminazione della cache della configurazione