Cos’è tap()
tap() è un helper che permette di “usare un valore e restituirlo così com’è”. Lo si utilizza quando si vuole intercalare un side effect.
L’implementazione in Illuminate\Support\helpers.php è semplice.
tap() ignora il valore di ritorno del callback. Il valore restituito è sempre il valore originale.Uso di base
L’uso più elementare consiste nel ricevere un valore, elaborarlo e restituirlo così com’è.HigherOrderTapProxy, quindi puoi concatenare direttamente le chiamate di metodo.
Casi d’uso frequenti
Inserire output di debug
Inserire log o eventi all’interno di una catena
Eseguire solo un side effect senza cambiare il valore restituito
Cos’è il trait Tappable
UsandoIlluminate\Support\Traits\Tappable puoi aggiungere alla tua classe il metodo tap().
tap().
Utilizzo nello sviluppo di pacchetti
Tappable è utile quando vuoi inserire un side effect all’interno di un’API fluent. Combinandolo con Macroable e Conditionable puoi creare builder estendibili in perfetto stile Laravel.
Pagine correlate:
- Trait Macroable
- Trait Conditionable
- VOICEVOX for Laravel — esempio pratico in cui
TalkAudioQueryoSongAudioQueryvengono regolati contap()prima di passare agenerate()
Esempi d’uso nel core di Laravel
Anche il core di Laravel utilizzatap() / Tappable.
Illuminate\Routing\RoutercombinaMacroableeTappable- In
Router::respondWithRoute()viene usatotap($route)->bind(...)senza callback, restituendo la$routeoriginale anche dopo l’esecuzione dibind() - In
Router::prepareResponse(), dopo la conversione della risposta, viene emesso un evento contap(..., fn (...) => event(...)) - In
Illuminate\Testing\Fluent\Concerns\Hasil pattern->tap(...)->first(...)->etc()viene usato per implementare helper di assertion
Da solo
tap() è un piccolo helper, ma combinato con Macroable e Conditionable rende più facile scrivere le catene di metodi leggibili tipiche di Laravel.Prossimi passi
Trait Macroable
Impara come progettare l’aggiunta di metodi personalizzati a classi esistenti.
Trait Conditionable
Impara le catene condizionali con
when() / unless().