什么是 InteractsWithData trait
Illuminate\Support\Traits\InteractsWithData 是一个把「面向数组式输入数据的公共 API」聚合到一起的 trait。
它本身只要求 all() 与 data() 两个抽象方法,将实际数据获取逻辑委托给各个类。作为补偿,它统一提供了以下高频方法:
- 存在性判断:
has()、hasAny()、exists()、missing() - 空值判断:
filled()、isNotFilled()、anyFilled() - 条件执行:
whenHas()、whenFilled()、whenMissing() - 抽取:
only()、except() - 类型转换:
string()、boolean()、integer()、float()、date()、enum()、collect()
与 Request 系方法的关系
request() 辅助函数所取得的 Illuminate\Http\Request,通过 Concerns\InteractsWithInput 引入了 InteractsWithData。
因此,下列常见的输入访问都由该 trait 提供:
Request::get() 是 Request 类本体上兼容 Symfony 的方法。在 Laravel 13 的源码中被明确标注为 @deprecated use ->input() instead,推荐使用 input()。
Laravel 核心中的主要实现示例
直接 use InteractsWithData 的类
承担相近职责的相关实现
Illuminate\Session\Store独立实现了has()、get()、only()、except()等类似 APIIlluminate\Validation\Concerns\ValidatesAttributes提供验证判定逻辑,输入访问 API 本身与InteractsWithData是不同职责
trait 与主要类的关系
在包开发中集成到自定义类
InteractsWithData 适合在包内部「持有输入数组,并想要提供 Laravel 风格获取 API」的类。
1
创建数据容器类
2
用类型化访问器安全读取
实战用例
- 外部 API 客户端的 Option Bag
- Webhook payload 的规范化层
- 包配置覆盖解析类
all() 与 data(),就无需每次自造输入访问 API,可显著降低维护成本。