Was ist der Macroable-Trait?
Der TraitMacroable erlaubt es, einer Klasse nachträglich dynamisch Methoden hinzuzufügen, ohne sie zu verändern. Viele Kernklassen von Laravel setzen diesen Trait ein — Sie können also Funktionalität erweitern, ohne den Framework-Code selbst anzufassen.
Die eigentliche Implementierung liegt in Illuminate\Support\Traits\Macroable. Intern werden registrierte Macros in der statischen Property $macros gespeichert und über die Magic Methods __call und __callStatic aufgerufen.
Klassen, die Macroable nutzen
Laravel enthält zahlreiche Klassen mit Macroable-Unterstützung.macro() — Methode hinzufügen
Als erstes Argument vonmacro() übergeben Sie den Methodennamen, als zweites eine Closure.
$this an die Instanz gebunden, auf der das Macro aufgerufen wurde. Damit können Sie direkt auf Klassen-Properties und -Methoden zugreifen.
mixin() — mehrere Methoden gleichzeitig hinzufügen
Wenn Sie viele Macros gemeinsam registrieren möchten, nutzen Siemixin(). Alle public- und protected-Methoden der Mixin-Klasse werden als Macros registriert.
Die Methoden für
mixin() müssen eine Closure zurückgeben, die als Macro registriert wird. Der Rückgabewert der Methode selbst ist die eigentliche Macro-Implementierung.Registrierung im Service Provider
Macros müssen beim Anwendungsstart registriert werden. Ein geeigneter Ort ist die Methodeboot() des AppServiceProvider.
Praktische Anwendungsfälle
Erweiterung von Collections
Eigene Methoden auf Collections zu ergänzen ist der häufigste Anwendungsfall.Erweiterung der Str-Klasse
Erweiterung der Request-Klasse
Erweiterung von Blueprint (Migrationen)
Wenn Sie Spaltendefinitionen als Macro bündeln, bleiben Ihre Datenbankdesigns konsistent.Erweiterung der Test-Response
Sie können Test-spezifische Assertion-Methoden ergänzen.hasMacro() — Existenz eines Macros prüfen
flushMacros() — Macros zurücksetzen
Nützlich, wenn Sie Macros in einem Test zurücksetzen möchten.Statische Macros
Macros funktionieren nicht nur als Instanzmethoden, sondern auch als statische Methoden. Verantwortlich ist__callStatic.
Macroable in eigenen Klassen nutzen
Sie könnenMacroable auch in Ihren eigenen Klassen einsetzen.
Details der Implementierung
Closure::bindTo() an die Instanz gebunden. Dadurch zeigt $this auf das Objekt, auf dem das Macro aufgerufen wurde. Andere Werte (etwa invokable Objekte) werden nicht gebunden.
Nächste Schritte
Pipeline-Muster
Lernen Sie, wie Sie mit dem Pipeline-Muster mehrere Verarbeitungsschritte seriell verketten.