Was ist tap()?
tap() ist ein Helper, der „einen Wert benutzt und ihn dennoch unverändert zurückgibt”. Er kommt zum Einsatz, wenn Sie einen Seiteneffekt einschleifen möchten.
Die Implementierung in Illuminate\Support\helpers.php ist schlicht:
tap() ignoriert den Rückgabewert des Callbacks. Zurückgegeben wird stets der ursprüngliche Wert.Grundlegende Verwendung
Der grundlegendste Einsatz besteht darin, den Wert zu übernehmen, etwas damit zu tun und ihn unverändert zurückzugeben.HigherOrderTapProxy — so lässt sich der Methodenaufruf direkt anfügen.
Typische Einsatzstellen
Debug-Ausgabe einfügen
Logging oder Event-Versand innerhalb der Chain einfügen
Seiteneffekte ausführen, ohne den Rückgabewert zu verändern
Was ist der Tappable-Trait?
Wenn SieIlluminate\Support\Traits\Tappable per use einbinden, erhält Ihre Klasse eine tap()-Methode.
tap().
Einsatz in der Paketentwicklung
Tappable ist praktisch, wenn Sie in einer Fluent API einen Seiteneffekt einbauen möchten. In Kombination mit Macroable und Conditionable bauen Sie einen Laravel-typischen, erweiterbaren Builder.
Verwandte Seiten:
- Macroable-Trait
- Conditionable-Trait
- VOICEVOX for Laravel — Praxisbeispiel, in dem
TalkAudioQueryundSongAudioQuerypertap()angepasst und anschließend angenerate()weitergegeben werden
Verwendung im Laravel-Kern
Auch im Laravel-Kern selbst kommentap() und Tappable zum Einsatz.
Illuminate\Routing\RouterverwendetMacroableundTappablegemeinsam.- In
Router::respondWithRoute()wird ohne Callbacktap($route)->bind(...)genutzt und die ursprüngliche$routeauch nachbind()zurückgegeben. - In
Router::prepareResponse()wird nach der Response-Konvertierung mittap(..., fn (...) => event(...))ein Event ausgelöst. - In
Illuminate\Testing\Fluent\Concerns\Hasunterstützt der Aufruf->tap(...)->first(...)->etc()die Assertions.
Für sich genommen ist
tap() ein kleiner Helper — in Kombination mit Macroable und Conditionable entstehen jedoch gut lesbare Method-Chains, wie man sie in Laravel häufig sieht.Nächste Schritte
Macroable-Trait
Lernen Sie das Design kennen, mit dem Sie bestehende Klassen um eigene Methoden erweitern.
Conditionable-Trait
Lernen Sie Bedingungs-Chains mit
when() / unless() kennen.