Qué es GeneratorCommand
Illuminate\Console\GeneratorCommand es la clase abstracta base para todos los comandos de generación de código de Laravel. make:model, make:controller, make:request, etc. la extienden.
Si un paquete ofrece su propio comando make:xxx, en lugar de crear las clases a mano el usuario ejecuta php artisan make:handler OrderHandler y obtiene el archivo generado con el namespace correcto.
GeneratorCommand apenas está documentado oficialmente y no se puede entender sin leer el código fuente del framework. Es un tema avanzado típico.Implementación mínima
Lo único obligatorio al extenderGeneratorCommand es implementar el método getStub(). El resto de propiedades es opcional, pero en la práctica se declaran las siguientes.
| Miembro | Tipo | Rol |
|---|---|---|
$name | Propiedad | Nombre del comando (por ejemplo, make:handler). |
$description | Propiedad | Descripción del comando. |
$type | Propiedad | Nombre del tipo generado. Se usa en el mensaje de éxito (por ejemplo, Handler). |
getStub() | Método (obligatorio) | Devuelve la ruta del archivo stub. |
getDefaultNamespace() | Método | Controla el namespace por defecto del destino. |
make:handler.
getDefaultNamespace(), al ejecutar php artisan make:handler OrderHandler se genera la clase App\Handlers\OrderHandler en app/Handlers/OrderHandler.php.
Creación del archivo stub
Coloca el archivo stub en la ruta devuelta porgetStub(). Un stub es un archivo PHP plantilla en el que ciertos placeholders se sustituyen por el namespace y el nombre de clase.
src
Console
Commands
HandlerMakeCommand.php
stubs
handler.stub
handler.stub
GeneratorCommand sustituye automáticamente los siguientes placeholders dentro del stub.
| Placeholder | Valor sustituido | Notación alternativa |
|---|---|---|
{{ namespace }} | Namespace de la clase generada. | DummyNamespace |
{{ class }} | Nombre de la clase generada. | DummyClass |
{{ rootNamespace }} | Namespace raíz de la aplicación. | DummyRootNamespace |
{{ namespace }} y DummyNamespace producen el mismo resultado. Los stubs integrados de Laravel usaban ambas formas, pero para stubs nuevos se recomienda {{ namespace }}.
Permitir la personalización del stub
Para permitir que los usuarios sobrescriban el stub, utiliza el patrónresolveStubPath(). Primero, publica el stub en el boot() del service provider.
getStub(), usa preferentemente el stub personalizado por el usuario.
php artisan vendor:publish --tag=stubs podrán editar stubs/handler.stub en la raíz del proyecto para modificar la plantilla.
Registro en el service provider
Los comandos se registran en el métodoboot() del service provider. Al comprobar runningInConsole(), evitas cargas innecesarias durante las peticiones web.
extra.laravel en el composer.json del paquete, los usuarios no tienen que registrar manualmente el service provider.
Ejemplos de aplicación
Algunos casos de uso dondeGeneratorCommand brilla.
Extensión de FormRequest
Extensión de FormRequest
Un comando que genera Requests que heredan de una clase base propia con lógica de autenticación o validaciones personalizadas. En
getDefaultNamespace() devuelves App\Http\Requests.Generador de DTO
Generador de DTO
Un comando que produce el boilerplate de un Data Transfer Object. Prepara un stub con propiedades readonly y un método factory
from().Clase Action
Clase Action
Un comando que genera clases Action con responsabilidad única. Genera una clase con método
execute() en el namespace App\Actions.Livewire usa el mismo mecanismo
Livewire usa el mismo mecanismo
El comando
make:livewire está implementado por la clase MakeCommand, que extiende GeneratorCommand. Sobrescribe handle() para generar simultáneamente el archivo de la clase del componente y la vista Blade.Pruebas
Con Orchestra Testbench, prueba que tu comando genera correctamente los archivos.Páginas relacionadas
Desarrollo de paquetes Laravel
Repasa los fundamentos del desarrollo de paquetes con service providers.
Probar paquetes Laravel con Orchestra Testbench
Aprende a montar la base de las pruebas de tu paquete.