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.

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.

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.

Pubblicazione delle migrazioni

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

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.

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.

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().

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().

Aggiungere informazioni al comando about

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

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 2 agosto 2026