跳转到主要内容

什么是 Fluent 类

Fluent 类是可以像对象一样处理数组的通用工具类。它实现在 Illuminate\Support\Fluent 中,自 Laravel 早期版本就存在,但在官方文档中几乎没有记载。 在内部它使用属性管理数组,并通过魔术方法(__get / __set / __call)实现类似属性的读写。
Laravel 11 新增了 fluent() 辅助函数,同时 Fluent 类也被强化,是一个正当其时值得使用的优秀类。

创建实例

构造函数

make() 工厂方法

fluent() 辅助函数

Laravel 11 中新增了 fluent() 辅助函数,与 Fluent::make() 等价。

访问属性

动态属性的读写

链式调用

通过 __call 魔术方法,调用不存在的方法时会将参数设置为对应属性。方法返回 $this,因此可以链式调用。
通过这种机制,你可以以流畅 API(Fluent Interface)的方式代替数组来设置值。

主要方法

get() — 用点号语法访问

set() — 用点号语法设置

fill() — 一次性设置多个属性

all() — 以数组形式获取全部属性

scope() — 将嵌套值转换为新的 Fluent

由此可以将嵌套的数组当作另一个 Fluent 对象处理。

value() — 用回调动态指定默认值

数组操作

toArray() — 转换为数组

getAttributes() — 直接访问内部属性

ArrayAccess 接口

Fluent 实现了 ArrayAccess,可以像数组一样操作。

IteratorAggregate 接口

Fluent 可以用 foreach 循环。

JSON 处理

toJson() — 转换为 JSON 字符串

toPrettyJson() — 转换为格式化的 JSON

JsonSerializable 接口

Fluent 实现了 JsonSerializable,因此可以直接通过 json_encode() 转换。

状态检查

isEmpty() / isNotEmpty()

Conditionable trait

Fluent 使用了 Conditionable trait,支持条件处理。
使用 when() / unless() 方法可以流畅地基于条件描述配置。

Macroable trait

Fluent 也使用了 Macroable trait,可以动态添加方法。

实战用例

API 响应构造器

配置构造器

请求参数的校验与转换

模型与 Fluent 的组合

表单数据的规范化

与其他类的对比

Fluent vs Array

Fluent vs Model

内部实现细节

当没有注册宏时,__call 方法会将方法名作为属性键设置值,并返回 $this。这就是链式调用能够成立的原因。
Fluent 使用了以下 trait,各自提供不同功能:
  • Conditionable — 用 when() / unless() 进行条件处理
  • InteractsWithDatadata() 等数据操作方法
  • Macroable — 动态方法添加

下一步

Collection 类

深入了解处理多元素的 Collection 类。

Conditionable trait

学习流畅描述条件处理的 Conditionable trait。

Macroable trait

学习向既有类添加动态方法的 Macroable trait。
最后修改于 2026年7月18日