Skip to main content

Cos’è un pacchetto

In Laravel un pacchetto è un pacchetto Composer che aggiunge funzionalità all’applicazione. Ne esistono principalmente due tipi.
  • Pacchetto standalone — libreria PHP generica non dipendente da Laravel (es. Carbon, Pest)
  • Pacchetto Laravel — pacchetto integrato con Laravel che offre rotte, controller, view, configurazione, ecc.
Questa guida tratta il secondo caso: lo sviluppo di pacchetti specifici per Laravel. Serve una conoscenza approfondita della struttura interna di Laravel — service provider, facade, pubblicazione della configurazione.
Per scrivere i test di un pacchetto usi Orchestra Testbench. Ti permette di scrivere i test del pacchetto come faresti in una normale applicazione Laravel.

Auto-discovery dei pacchetti

Quando installi un pacchetto, Laravel legge la sezione extra.laravel del composer.json e registra automaticamente service provider e facade.
Con questa configurazione, l’utente non deve modificare manualmente bootstrap/providers.php: il pacchetto viene caricato automaticamente.

Disabilitare l’auto-discovery

Se l’utente vuole disabilitare l’auto-discovery per un pacchetto specifico, imposta il composer.json dell’applicazione.

Ruolo del service provider

Il service provider è il punto di ingresso del pacchetto. Concentra qui la registrazione delle risorse — view, config, migrazioni, rotte — in Laravel. Estende Illuminate\Support\ServiceProvider e ha due metodi: register e boot.
In register non registrare listener di eventi, rotte o view. Rischi di usare per errore servizi di un altro service provider non ancora caricato. Le operazioni diverse dai binding vanno sempre in boot.

Pubblicare i file di configurazione

publishes() — pubblicare i file

Chiamando publishes() in boot, l’utente può copiare i file di configurazione nella propria app con vendor:publish.
Dopo la pubblicazione, i valori si leggono con la normale API config.

mergeConfigFrom() — fondere con i valori di default

Con mergeConfigFrom() in register, i default del pacchetto si applicano anche se l’utente non ha pubblicato il file.
mergeConfigFrom() non fonde a livelli profondi degli array annidati. In configurazioni con array multidimensionali, se l’utente definisce solo una parte, il resto delle opzioni potrebbe non essere fuso.

Separare i gruppi di pubblicazione con i tag

Passando un tag come secondo argomento di publishes(), l’utente pubblica solo le risorse desiderate.

Registrare rotte

Carica i file delle rotte con loadRoutesFrom(). Se la cache delle rotte dell’app è attiva, viene automaticamente saltato.
Nel file delle rotte indichi i controller del pacchetto.

Pubblicare le migrazioni

Con publishesMigrations() puoi pubblicare i file di migrazione. Al momento della pubblicazione Laravel aggiorna automaticamente il timestamp.

Pubblicare le view

loadViewsFrom() — registrare le view

Con loadViewsFrom() registri la directory delle view. Usa il namespace del secondo argomento per riferirti alle view come package::view.
Dopo la registrazione, riferisci le view con il namespace del pacchetto.
Laravel cerca le view in due posti: prima in resources/views/vendor/courier dell’app, poi nella directory view del pacchetto. Questo permette all’utente di personalizzarle.

Pubblicare le view

Registrare componenti Blade

Se includi componenti nel pacchetto li registri in boot.
Puoi anche registrarli in blocco con un namespace di componenti.

Pubblicare i file di traduzione

Registri i file di traduzione con loadTranslationsFrom(). Le traduzioni si referenziano nella forma package::file.key.
Per file di traduzione JSON usi loadJsonTranslationsFrom().

Registrare comandi

I comandi Artisan del pacchetto si registrano con il metodo commands(). Di solito solo in ambiente console.

Integrazione con il comando optimize

Se il pacchetto ha una sua cache, con il metodo optimizes() puoi integrarti con php artisan optimize e php artisan optimize:clear.

Aggiungere informazioni al comando about

Per aggiungere informazioni del pacchetto all’output di php artisan about usa AboutCommand::add().

Creare un facade

Un facade permette di richiamare i binding del service container come metodi statici.
1

Creare la classe di servizio

2

Creare la classe facade

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

Fai il binding nel service provider

4

Registrare in composer.json

Aggiungendo le annotazioni PHPDoc @method ai metodi del facade abiliti l’autocompletamento dell’IDE.

DeferrableProvider — implementare il caricamento differito

I provider che eseguono solo binding nel container possono realizzare il caricamento differito implementando l’interfaccia DeferrableProvider. Il provider non viene caricato finché il servizio non è effettivamente necessario: le prestazioni dell’app migliorano.
Laravel compila e memorizza la lista dei servizi forniti dai deferred provider. Il provider viene caricato solo quando uno dei servizi elencati in provides() viene risolto.
Non usare DeferrableProvider in provider che devono registrare risorse (view, rotte, listener di eventi, ecc.). Con il caricamento differito, quelle risorse resterebbero non registrate.

Test del pacchetto

Per testare il pacchetto in isolamento usa Orchestra Testbench. Ti permette di scrivere i test come se fossi in un’app Laravel.
Nel test case fai override di getPackageProviders() per registrare il service provider del pacchetto.

Pubblicazione su Composer

Best practice per pubblicare il pacchetto su Packagist. Impostazioni base di composer.json
Dipendere da illuminate/support invece che da tutto illuminate/framework ti fa dipendere solo dai componenti necessari. Mantieni piccolo l’albero delle dipendenze del pacchetto.
Esempio di struttura delle directory

Pagine correlate

Service provider

Rivedi i metodi register e boot dei service provider e i dettagli dei deferred provider.

Gestione della compatibilità tra versioni

Strategie per adattarsi agli upgrade major di Laravel e PHP e configurazione della matrix di test in GitHub Actions.
Ultima modifica il 13 luglio 2026