什么是 tap()
tap() 是「使用值的同时把这个值原样返回」的辅助函数。适合插入副作用的场景。
Illuminate\Support\helpers.php 的实现很简单。
tap() 会忽略回调的返回值,其返回值始终是原始值。基本用法
最基本的用法是接收一个值、处理后再原样返回。HigherOrderTapProxy,可以直接链式调用方法。
典型使用场景
插入调试输出
在链式调用中插入日志或事件
不改变返回值只做副作用
什么是 Tappable trait
在类中use Illuminate\Support\Traits\Tappable 可以添加 tap() 方法。
tap()。
在包开发中的应用
Tappable 在 Fluent API 中间需要插入副作用时非常方便。结合 Macroable 与 Conditionable,可以构建颇有 Laravel 味道的可扩展 Builder。
1
创建流畅 API 的类
2
组合使用 Macroable、Conditionable、Tappable
- Macroable trait
- Conditionable trait
- VOICEVOX for Laravel — 通过
tap()调整TalkAudioQuery或SongAudioQuery后送入generate()的实用示例
Laravel 核心中的使用示例
Laravel 本体中也在真实地使用tap() / Tappable。
Illuminate\Routing\Router同时使用了Macroable与TappableRouter::respondWithRoute()使用无回调的tap($route)->bind(...),bind()执行后仍返回原始的$routeRouter::prepareResponse()在响应转换后使用tap(..., fn (...) => event(...))触发事件Illuminate\Testing\Fluent\Concerns\Has中用->tap(...)->first(...)->etc()这样的链式实现断言辅助
tap() 单独看是一个小巧辅助函数,与 Macroable、Conditionable 结合,能非常便利地写出 Laravel 常见的易读方法链。下一步
Macroable trait
学习向既有类添加自定义方法的设计。
Conditionable trait
学习基于
when() / unless() 的条件分支链。