Wat is de Macroable-trait
DeMacroable-trait is een mechanisme waarmee je achteraf dynamisch methodes aan een klasse kunt toevoegen zonder de klasse zelf te wijzigen. Veel coreklassen van Laravel gebruiken deze trait, zodat je functionaliteit kunt uitbreiden zonder aan de corecode te komen.
De trait zelf staat in Illuminate\Support\Traits\Macroable. Intern worden geregistreerde macro’s opgeslagen in de statische property $macros en aangeroepen via de magic methods __call / __callStatic.
Klassen die Macroable gebruiken
Laravel heeft veel klassen die Macroable ondersteunen.macro() — een methode toevoegen
Aanmacro() geef je als eerste argument de methodenaam en als tweede argument een closure mee.
$this binnen de closure wordt gebonden aan de instantie die de macro aanroept. Daardoor heb je rechtstreeks toegang tot de properties en methodes van de klasse.
mixin() — meerdere methodes tegelijk toevoegen
Wil je veel macro’s in één keer registreren, dan gebruik jemixin(). Alle public / protected methodes van de mixinklasse worden als macro geregistreerd.
De methodes van een
mixin() moeten de closure teruggeven die als macro wordt geregistreerd. De returnwaarde van de methode zelf wordt de implementatie van de macro.Registreren in de service provider
Macro’s moeten worden geregistreerd bij het opstarten van de applicatie. Deboot()-methode van de AppServiceProvider is daarvoor de juiste plek.
Praktische use cases
Collecties uitbreiden
Eigen methodes toevoegen aan collecties is het meest voorkomende gebruik.De Str-klasse uitbreiden
De Request-klasse uitbreiden
Blueprint uitbreiden (migraties)
Door kolomdefinities van je schema in macro’s te bundelen, houd je een consistent databaseontwerp.Testresponses uitbreiden
Je kunt assertion-methodes speciaal voor tests toevoegen.hasMacro() — controleren of een macro bestaat
flushMacros() — macro’s resetten
Gebruik je wanneer je macro’s in tests wilt resetten.Statische macro’s
Macro’s werken niet alleen als instantiemethodes, maar ook als statische methodes. Ze worden afgehandeld door__callStatic.
De Macroable-trait in je eigen klassen gebruiken
Je kuntMacroable ook inbouwen in klassen die je zelf hebt gemaakt.
Details van de interne implementatie
Closure::bindTo() aan de instantie gebonden. Daardoor wijst $this naar het object dat de macro aanroept. Bij iets anders dan een closure (zoals een invokable object) vindt geen binding plaats.
Volgende stap
Pipeline-patroon
Leer hoe je met het pipeline-patroon meerdere verwerkingsstappen serieel samenstelt.