ServiceProvider, VendorPublishCommand e Migrator di Laravel 13. Il riferimento per l’implementazione del framework è v13.34.0.
Copiare i file o caricarli dal pacchetto
publishesMigrations() si limita a registrare l’origine e la destinazione della copia come risorse pubblicabili. L’avvio del provider non copia alcun file né esegue SQL.
loadMigrationsFrom(), invece, registra un percorso di ricerca nel Migrator. Con il normale migrate vengono considerati anche i file di quel percorso, ma l’avvio del provider da solo non li esegue.
Se l’utente deve poter adattare nomi di tabelle o colonne prima dell’esecuzione, la pubblicazione è l’opzione da considerare. Se è il pacchetto a gestire lo schema e non si prevede che l’utente modifichi i file, puoi valutare il caricamento diretto. I due esempi di provider che seguono sono alternativi.
Implementare la pubblicazione
Assegna un tag specifico del pacchetto, così l’utente può pubblicare queste risorse separatamente dalle altre.La modifica del timestamp dipende dalla configurazione
La documentazione ufficiale descrive l’aggiornamento del timestamp delle migrazioni alla data e ora correnti durante la pubblicazione. Tuttavia, nell’implementazione diServiceProvider::publishesMigrations(), l’origine viene aggiunta ai file soggetti all’aggiornamento del timestamp solo se database.migrations.update_date_on_publish è attivo. Il valore di fallback usato per leggere questa impostazione è false.
Il file config/database.php dell’applicazione standard di Laravel 13 contiene la configurazione seguente. Nelle applicazioni che hanno ereditato una struttura precedente, verifica anche che l’impostazione esista.
VendorPublishCommand riscrive la data quando il file corrisponde al percorso reale di un’origine registrata e il nome di destinazione contiene il formato YYYY_MM_DD_HHMMSS_. Partendo dall’ora di avvio del comando, aggiunge un secondo per ogni file interessato. Se il nome non contiene questo formato, in quel passaggio la data non viene aggiunta.
L’aggiornamento del timestamp dipende sia dalla registrazione nel pacchetto sia dalla configurazione dell’applicazione che lo usa. Non modificare questa impostazione in modo forzato dal provider del pacchetto: documenta invece il prerequisito nelle istruzioni di installazione. Se usi la cache della configurazione, dopo la modifica devi anche ricostruirla.
Ripubblicare non significa “aggiungere solo ciò che non è stato eseguito”
vendor:publish non controlla lo storico di esecuzione nel database. Inoltre, nella logica di copia di v13.34.0, l’esistenza del file viene verificata sulla destinazione prima della modifica del timestamp. Anche nella pubblicazione di una directory, si controlla prima se nella destinazione esiste lo stesso percorso relativo dell’origine, e solo dopo viene riscritta la data.
Di conseguenza, se alla prima pubblicazione la data è cambiata e nell’applicazione non esiste un file con lo stesso nome dell’origine, pubblicando di nuovo lo stesso tag potrebbe essere aggiunto un file con una data diversa. Non dare per scontato che, senza --force, i duplicati vengano sempre evitati.
Lo stato di esecuzione si determina dal nome del file
Migrator::getMigrationName() restituisce il nome base del file senza .php. Per stabilire se una migrazione non è ancora stata eseguita, questo nome viene confrontato con lo storico di esecuzione. La verifica non si basa sull’identità del contenuto PHP o del nome della tabella.
Implementare il caricamento diretto
Se vuoi che le migrazioni del pacchetto vengano eseguite così come sono, registra un percorso di ricerca. In questo approccio non si aggiunge alcuna pubblicazione degli stessi file.loadMigrationsFrom() chiama path() quando il Migrator viene risolto. Migrator::path() elimina i percorsi di ricerca duplicati, mentre getMigrationFiles() indicizza i file trovati per nome di migrazione e li ordina in base a tale nome.
Quando l’utente aggiorna il pacchetto, i nuovi file vengono considerati dal successivo migrate. Non rinominare i file esistenti: per le nuove modifiche allo schema aggiungi nuovi file. Per evitare conflitti con altri pacchetti, includi anche il nome della funzionalità, come in create_courier_deliveries_table. File con lo stesso nome producono la stessa chiave e non vengono eseguiti entrambi in modo indipendente.
Distribuire le modifiche allo schema agli utenti esistenti
Per esempio, per aggiungere un codice di tracciamento alla tabella delle spedizioni, non modificare ilcreate_courier_deliveries_table già pubblicato, ma aggiungi un nuovo file dedicato alla modifica. Anche se modifichi la migrazione di creazione esistente, la modifica non verrà eseguita per gli utenti che l’hanno già eseguita.
database/migrations/2026_10_02_000000_add_tracking_code_to_courier_deliveries_table.php
Verifiche prima del rilascio
Oltre ai test del database del pacchetto, verifica le procedure di pubblicazione e aggiornamento in un’applicazione che lo usa. Caricare direttamente le migrazioni nei test non equivale a verificare la pubblicazione, in cui i nomi dei file cambiano.- Una prima installazione su un database vuoto crea le tabelle necessarie.
- L’aggiornamento a partire dal database e dallo storico di esecuzione di una release precedente applica solo le nuove modifiche.
- Controllando l’elenco dei file dopo aver ripetuto lo stesso comando di pubblicazione, la procedura di aggiornamento non genera duplicati.
- La procedura tiene conto dell’aggiornamento della data attivo o disattivo e delle modifiche ai file pubblicati.
- Verifica il rollback delle nuove migrazioni e il loro ordine di esecuzione rispetto alle altre migrazioni dell’applicazione.
Pagine correlate
Migrazioni
Le basi di definizione dello schema, storico di esecuzione e rollback.
Test dei pacchetti
Testa il service provider e il database del pacchetto.
Merge e cache della configurazione dei pacchetti
Procedure di aggiornamento che tengono conto della configurazione dell’utente e della relativa cache.
Gestione della compatibilità tra versioni
Collega le procedure di aggiornamento e le modifiche di compatibilità alla politica di rilascio.
Fonti primarie consultate
- Documentazione ufficiale di Laravel: migrazioni dei pacchetti
- ServiceProvider: registrazione delle risorse pubblicabili e dei percorsi di ricerca
- VendorPublishCommand: copia e modifica dei timestamp
- Migrator: rilevamento dei file e determinazione delle migrazioni non eseguite
- Applicazione standard di Laravel 13: configurazione del database