Wat is GeneratorCommand
Illuminate\Console\GeneratorCommand is de abstracte basisklasse voor alle codegeneratiecommando’s van Laravel. make:model, make:controller, make:request en dergelijke extenden allemaal deze klasse.
Als je pakket een eigen make:xxx commando aanbiedt, hoeven gebruikers klassen niet meer handmatig aan te maken: ze voeren gewoon iets als php artisan make:handler OrderHandler uit en er wordt een bestand met de juiste namespace gegenereerd.
GeneratorCommand staat nauwelijks in de officiële documentatie; je begrijpt hem pas als je de broncode van het framework zelf leest. Een typisch gevorderd onderwerp.Minimale implementatie
Een klasse dieGeneratorCommand extendt, hoeft alleen de methode getStub() te implementeren. De overige properties zijn optioneel, maar in de praktijk stel je het volgende in.
Hier een voorbeeld van de implementatie van een
make:handler commando.
getDefaultNamespace() ingesteld wordt bij het uitvoeren van php artisan make:handler OrderHandler de klasse App\Handlers\OrderHandler gegenereerd in app/Handlers/OrderHandler.php.
Een stub-bestand maken
Plaats een stub-bestand op het pad datgetStub() teruggeeft. Een stub is een PHP-bestand dat als template dient; de placeholders worden vervangen door de namespace en de klassenaam.
src
Console
Commands
HandlerMakeCommand.php
stubs
handler.stub
handler.stub
GeneratorCommand vervangt automatisch de volgende placeholders in de stub.
{{ namespace }} en DummyNamespace geven allebei hetzelfde resultaat. De ingebouwde stubs van Laravel bevatten beide vormen, maar voor nieuwe stubs wordt de vorm {{ namespace }} aanbevolen.
Aanpasbare stubs mogelijk maken
Om gebruikers de mogelijkheid te geven stubs te overschrijven, gebruik je hetresolveStubPath()-patroon. Publiceer eerst de stubs in de boot() van je service provider.
getStub() voorrang geven aan de door de gebruiker aangepaste stub.
php artisan vendor:publish --tag=stubs uitvoeren, kunnen de template aanpassen door stubs/handler.stub in de projectroot te bewerken.
Registreren in de service provider
Commando’s registreer je in deboot()-methode van de service provider. Door te controleren met runningInConsole() voorkom je onnodig laden bij webrequests.
extra.laravel instelt in de composer.json van je pakket, hoeven gebruikers de service provider niet handmatig te registreren.
Toepassingen
Enkele use cases waarinGeneratorCommand goed van pas komt.
Uitgebreide form requests
Uitgebreide form requests
Een commando dat Requests genereert die extenden van een eigen basisklasse met authenticatiechecks of aangepaste validatielogica. Laat
getDefaultNamespace() App\Http\Requests teruggeven.DTO-generator
DTO-generator
Een commando dat de boilerplate voor Data Transfer Objects genereert. Voorzie een stub met readonly properties en een
from()-factorymethode.Action-klassen
Action-klassen
Een commando dat Action-klassen met één verantwoordelijkheid genereert. Genereert klassen met een
execute()-methode in de namespace App\Actions.Livewire gebruikt hetzelfde mechanisme
Livewire gebruikt hetzelfde mechanisme
Het commando
make:livewire is geïmplementeerd in de klasse MakeCommand, die GeneratorCommand extendt. Om tegelijk twee bestanden te genereren — een componentklasse en een Blade-view — wordt handle() overschreven.Testen
Met Orchestra Testbench test je dat het commando de bestanden correct genereert.Gerelateerde pagina’s
Laravel-pakketontwikkeling
Bekijk de basis van pakketontwikkeling met service providers.
Laravel-pakketten testen met Orchestra Testbench
Bekijk hoe je een basis opzet voor het testen van pakketten.