Cos’è GeneratorCommand
Illuminate\Console\GeneratorCommand è la classe astratta alla base di tutti i comandi di generazione di codice di Laravel. make:model, make:controller, make:request ne sono tutte estensioni.
Fornendo un proprio comando make:xxx nel pacchetto, l’utente non crea più le classi a mano: basta eseguire php artisan make:handler OrderHandler per generare il file con il namespace corretto.
GeneratorCommand è quasi assente dalla documentazione ufficiale: si comprende solo leggendo il codice sorgente del framework. È un tipico argomento avanzato.Implementazione minima
L’unico metodo obbligatorio nella classe che estendeGeneratorCommand è getStub(). Le altre proprietà sono opzionali, ma nella pratica sono presenti.
| Membro | Tipo | Ruolo |
|---|---|---|
$name | Proprietà | Nome del comando (es: make:handler) |
$description | Proprietà | Descrizione del comando |
$type | Proprietà | Tipo del risultato, usato nei messaggi di successo (es: Handler) |
getStub() | Metodo (obbligatorio) | Restituisce il path del file stub |
getDefaultNamespace() | Metodo | Controlla il namespace di default della generazione |
make:handler.
getDefaultNamespace() impostato, eseguendo php artisan make:handler OrderHandler viene generata la classe App\Handlers\OrderHandler in app/Handlers/OrderHandler.php.
Creare il file stub
Colloca il file stub nel percorso restituito dagetStub(). Lo stub è un file PHP template i cui placeholder vengono sostituiti con namespace e nome classe.
src
Console
Commands
HandlerMakeCommand.php
stubs
handler.stub
handler.stub
GeneratorCommand sostituisce automaticamente i placeholder seguenti.
| Placeholder | Valore sostituito | Forma alternativa |
|---|---|---|
{{ namespace }} | Namespace della classe generata | DummyNamespace |
{{ class }} | Nome della classe generata | DummyClass |
{{ rootNamespace }} | Namespace root dell’app | DummyRootNamespace |
{{ namespace }} e DummyNamespace hanno lo stesso risultato. Gli stub integrati di Laravel usavano entrambe le forme; per nuovi progetti consigliamo {{ namespace }}.
Permettere agli utenti di personalizzare lo stub
Per consentire all’utente di sovrascrivere lo stub, usa il patternresolveStubPath(). Prima pubblichi gli stub dal service provider in boot().
getStub() prediligi lo stub personalizzato dall’utente.
php artisan vendor:publish --tag=stubs può modificare il template editando stubs/handler.stub nella root del progetto.
Registrazione nel service provider
Il comando si registra nel metodoboot() del service provider. Verificando runningInConsole() eviti caricamenti inutili in fase di richiesta web.
extra.laravel nel composer.json del pacchetto, l’utente non deve registrare a mano il service provider.
Casi d’uso
Alcuni scenari tipici in cuiGeneratorCommand brilla.
Estensione delle form request
Estensione delle form request
Un comando che genera Request che estendono una tua classe base, con logica di autorizzazione e regole di validazione personalizzate. In
getDefaultNamespace() restituisci App\Http\Requests.Generatore di DTO
Generatore di DTO
Un comando che genera il boilerplate dei Data Transfer Object. Prepara uno stub con proprietà
readonly e un metodo factory from().Classi Action
Classi Action
Un comando che genera classi Action a singola responsabilità. Genera una classe nel namespace
App\Actions con il metodo execute().Anche Livewire usa questo meccanismo
Anche Livewire usa questo meccanismo
Il comando
make:livewire è implementato dalla classe MakeCommand che estende GeneratorCommand. Fa override di handle() per generare in una sola volta due file: la classe componente e la view Blade.Test
Con Orchestra Testbench verifichi che il comando generi correttamente il file.Pagine correlate
Sviluppo di pacchetti Laravel
Rivedi le basi dello sviluppo di pacchetti tramite service provider.
Testare pacchetti Laravel con Orchestra Testbench
Rivedi come costruire l’infrastruttura di test per un pacchetto.