跳转到主要内容

什么是 tap()

tap() 是「使用值的同时把这个值原样返回」的辅助函数。适合插入副作用的场景。 Illuminate\Support\helpers.php 的实现很简单。
tap() 会忽略回调的返回值,其返回值始终是原始值。

基本用法

最基本的用法是接收一个值、处理后再原样返回。
省略回调时会返回 HigherOrderTapProxy,可以直接链式调用方法。

典型使用场景

插入调试输出

在链式调用中插入日志或事件

不改变返回值只做副作用

想加工返回值时使用 with() 或普通的变量赋值。将 tap() 限定于副作用会更易读。

什么是 Tappable trait

在类中 use Illuminate\Support\Traits\Tappable 可以添加 tap() 方法。
也就是提供了实例方法版的 tap()

在包开发中的应用

Tappable 在 Fluent API 中间需要插入副作用时非常方便。结合 MacroableConditionable,可以构建颇有 Laravel 味道的可扩展 Builder。
1

创建流畅 API 的类

2

组合使用 Macroable、Conditionable、Tappable

相关页面:

Laravel 核心中的使用示例

Laravel 本体中也在真实地使用 tap() / Tappable
  • Illuminate\Routing\Router 同时使用了 MacroableTappable
  • Router::respondWithRoute() 使用无回调的 tap($route)->bind(...)bind() 执行后仍返回原始的 $route
  • Router::prepareResponse() 在响应转换后使用 tap(..., fn (...) => event(...)) 触发事件
  • Illuminate\Testing\Fluent\Concerns\Has 中用 ->tap(...)->first(...)->etc() 这样的链式实现断言辅助
tap() 单独看是一个小巧辅助函数,与 MacroableConditionable 结合,能非常便利地写出 Laravel 常见的易读方法链。

下一步

Macroable trait

学习向既有类添加自定义方法的设计。

Conditionable trait

学习基于 when() / unless() 的条件分支链。
最后修改于 2026年7月18日