Skip to main content

Cos’è un pacchetto

In Laravel un pacchetto è un pacchetto Composer che aggiunge funzionalità all’applicazione. Esistono principalmente due tipi.
  • Pacchetti standalone — librerie PHP generiche che non dipendono da Laravel (es. Carbon, Pest)
  • Pacchetti Laravel — pacchetti con funzionalità integrate a Laravel come route, controller, view, configurazioni
Questa guida tratta il secondo tipo, i pacchetti specifici per Laravel. Lo sviluppo di pacchetti richiede una conoscenza approfondita delle strutture interne di Laravel, come service provider, facade e pubblicazione dei file di configurazione.
Per scrivere test dei pacchetti si usa Orchestra Testbench. Puoi scrivere i test come faresti in una normale applicazione Laravel.

Auto-discovery dei pacchetti

Quando un pacchetto viene installato, Laravel legge la sezione extra.laravel di composer.json e registra automaticamente service provider e facade.
Con questa configurazione, l’utente non ha bisogno di modificare manualmente bootstrap/providers.php: il pacchetto viene caricato automaticamente.
Come è implementato l’auto-discovery e quando la cache viene ricostruita è spiegato in dettaglio in Struttura interna del package auto-discovery.

Disabilitare l’auto-discovery

Se l’utente vuole disabilitare l’auto-discovery per un pacchetto specifico, può configurarlo nel composer.json dell’applicazione.

Il ruolo dei service provider

Il service provider è il punto di ingresso del pacchetto. Qui centralizzi la registrazione di view, configurazioni, migrazioni, route e altre risorse in Laravel. Un service provider estende Illuminate\Support\ServiceProvider e ha due metodi: register e boot.
Non registrare event listener, route, view ecc. all’interno del metodo register. Potresti finire per usare per errore servizi di un altro service provider non ancora caricato. Le operazioni diverse dal binding vanno sempre effettuate nel metodo boot.
Per estendere un servizio senza crearlo finché non viene usato, applicando la configurazione anche quando è già stato risolto, consulta Hook di risoluzione dei servizi nei pacchetti. La pagina spiega quando viene eseguito callAfterResolving() e come progettare il codice per tollerare applicazioni ripetute. Per i metodi di registrazione che non trascinano stato nemmeno con Octane o con i queue worker, consulta Progettare il ciclo di vita dei servizi di un pacchetto. La pagina spiega l’implementazione interna di scoped() e le avvertenze sulle dipendenze conservate dai singleton.

Pubblicazione dei file di configurazione

publishes() — pubblicare file

Chiamando publishes() nel metodo boot, permetti all’utente di copiare i file di configurazione nella propria applicazione con il comando vendor:publish.
I valori di configurazione pubblicati si possono ottenere con il normale accesso a config.

mergeConfigFrom() — unire con i valori di default

Usando mergeConfigFrom() nel metodo register, i valori di default del pacchetto vengono usati anche quando l’utente non ha pubblicato il file di configurazione.
mergeConfigFrom() non unisce ricorsivamente gli array annidati fino ai livelli più profondi. Per configurazioni con array multidimensionali, se l’utente definisce solo una parte, le opzioni rimanenti potrebbero non essere unite.
Le differenze rispetto al metodo di sostituzione ricorsiva di Laravel 13, la gestione delle liste con chiavi numeriche e la procedura di aggiornamento quando usi la cache della configurazione sono spiegate in Merge e cache della configurazione dei pacchetti.

Separare i gruppi di pubblicazione tramite tag

Passando un tag come secondo argomento di publishes(), l’utente può pubblicare solo le risorse di cui ha bisogno.

Registrazione delle route

Per caricare i file di route si usa loadRoutesFrom(). Quando la cache delle route dell’applicazione è attiva, viene saltato automaticamente.
Nel file di route si specificano i controller del pacchetto.
Come specificare esplicitamente i middleware, evitare i conflitti di URI e nomi delle route e far arrivare le modifiche alla configurazione nella cache è spiegato in Registrazione e cache delle route di un pacchetto.

Pubblicazione delle migrazioni

Usando publishesMigrations() puoi registrare i file di migrazione per la pubblicazione. Nella configurazione standard di Laravel 13, database.migrations.update_date_on_publish è attivo, quindi il timestamp nel nome del file viene aggiornato al momento della pubblicazione. Se l’impostazione è disattivata o assente, questo aggiornamento non avviene.
Quando pubblicare o caricare direttamente, le condizioni per la modifica del timestamp, i rischi della ripubblicazione e le modifiche allo schema per gli utenti esistenti sono spiegati in Pubblicazione e aggiornamento delle migrazioni di un pacchetto.

Pubblicazione delle view

loadViewsFrom() — registrare le view

Con loadViewsFrom() registri la directory delle view. Tramite il namespace passato come secondo argomento, referenzi le view nella forma package::view.
Dopo la registrazione, le view si referenziano tramite il namespace del pacchetto.
Laravel cerca le view in due posizioni. Prima controlla la directory resources/views/vendor/courier dell’applicazione e, se non la trova, usa la directory delle view del pacchetto. Questo permette all’utente di personalizzare le view. L’ordine di ricerca effettivo e il fallback file per file, come far arrivare le modifiche ai template già pubblicati e la differenza rispetto alla cache di Blade sono spiegati in Sovrascrivere e aggiornare le view di un pacchetto.

Pubblicare le view

Registrare componenti Blade

Se includi componenti nel pacchetto, registrali nel metodo boot.
Puoi anche registrare in blocco usando un namespace di componenti.

Distribuzione degli asset pubblici

Per distribuire JavaScript, CSS e immagini del pacchetto, registra con publishes() la copia verso una destinazione come public_path('vendor/courier'). Anche se aggiorni il pacchetto, i file già pubblicati non cambiano automaticamente. La selezione dei file tramite tag e provider, la differenza tra --force e --existing, la gestione dei file eliminati e l’aggiornamento tramite laravel-assets sono spiegati in Asset pubblici e aggiornamento di un pacchetto.

Pubblicazione dei file di traduzione

Con loadTranslationsFrom() registri i file di traduzione. Le traduzioni si referenziano nella forma package::file.key.
Per usare file di traduzione JSON, utilizza loadJsonTranslationsFrom().
La sovrascrittura parziale delle traduzioni PHP, l’ordine di caricamento e la destinazione di sovrascrittura delle traduzioni JSON, la compatibilità delle chiavi di traduzione e l’aggiornamento dei file pubblicati sono spiegati in Sovrascrittura e aggiornamento delle traduzioni di un pacchetto.

Registrazione dei comandi

I comandi Artisan del pacchetto si registrano con il metodo commands(). È comune registrarli solo in ambiente console.

Integrazione con il comando optimize

Se il pacchetto ha una propria cache, puoi integrarla con php artisan optimize e php artisan optimize:clear tramite il metodo optimizes().
La registrazione delle classi di comando e la registrazione dei task di ottimizzazione sono operazioni distinte. Collisioni delle chiavi di registrazione, esclusione con --except, ordine di esecuzione rispetto ai task standard e codici di uscita in caso di errore sono spiegati in Cache dei pacchetti e integrazione con optimize.

Aggiungere informazioni al comando about

Per aggiungere informazioni sul pacchetto all’output di php artisan about, usa AboutCommand::add().
Il momento in cui vengono valutati i dati, --only e l’output JSON, un design che non espone segreti e lo stato di registrazione nei test sono spiegati in Aggiungere informazioni diagnostiche del pacchetto ad about.

Creazione di facade

Le facade ti permettono di chiamare i binding del service container come metodi statici.
1

Crea la classe di servizio

2

Crea la classe facade

Estendi Illuminate\Support\Facades\Facade e restituisci in getFacadeAccessor() la chiave del binding sul service container.
3

Effettua il binding nel service provider

4

Registra in composer.json

Aggiungendo alle facade le annotazioni PHPDoc @method, abiliti l’autocompletamento dell’IDE.

DeferrableProvider — implementare il caricamento differito

I provider che effettuano solo binding sul service container possono implementare il caricamento differito tramite l’interfaccia DeferrableProvider. Poiché il provider viene caricato solo quando il servizio è effettivamente richiesto, le performance dell’applicazione migliorano.
Laravel compila e salva la lista dei servizi forniti dai provider differiti. Il provider viene caricato solo quando uno dei servizi elencati in provides() viene risolto.
Non usare DeferrableProvider per provider che devono registrare risorse (view, route, event listener ecc.). Se caricati in modo differito, tali risorse rimarrebbero non registrate.

Test del pacchetto

Per testare il pacchetto in isolamento si usa Orchestra Testbench. Puoi scrivere i test del pacchetto come se ti trovassi all’interno di una normale applicazione Laravel.
Nel test case, sovrascrivi getPackageProviders() per registrare il service provider del pacchetto.

Pubblicazione su Composer

Best practice per pubblicare il pacchetto su Packagist. Configurazione di base di composer.json
Dipendendo da illuminate/support puoi includere come dipendenze solo i componenti Laravel necessari, invece dell’intero illuminate/framework. Mantieni piccolo l’albero delle dipendenze del pacchetto.
Esempio di struttura delle directory

Pagine correlate

Service provider

Approfondisci i metodi register e boot dei service provider e i provider differiti.

Gestione della compatibilità di versione

Strategie per gestire gli upgrade di versione maggiore di Laravel e PHP e configurazione della matrice di test con GitHub Actions.
Ultima modifica il 14 ottobre 2026