什么是 Support Contracts
Illuminate\Contracts\Support 汇集了 Laravel 全局中体量虽小但很重要的接口。
其中 Arrayable / Jsonable / Htmlable / Responsable 是让 Value Object、DTO、Response 对象自然融入 Laravel 现有流程的基本模式。
这里的签名来自 Laravel 13.x 的官方源代码(
laravel/framework)。1) Arrayable
接口定义
实现示例
在 Laravel 核心中的使用
Illuminate\Database\Eloquent\Model实现了Arrayable,提供toArray()Illuminate\Http\JsonResponse::setData()检测到Arrayable时会用json_encode($data->toArray(), ...)序列化
包开发中的应用要点
- 让 DTO、Value Object 在 Controller、Resource、日志输出中拥有统一格式
- 将「转数组」的职责封装在对象自身
2) Jsonable
接口定义
实现示例
在 Laravel 核心中的使用
Model同时实现了Jsonable,提供toJson($options = 0)JsonResponse::setData()会优先判定Jsonable,使用其toJson()
包开发中的应用要点
- 在审计日志、Webhook 发送中严格固定 JSON 结构
- 不完全依赖
json_encode(),把领域相关的 JSON 表达明确写在对象里
3) Htmlable
接口定义
实现示例
在 Laravel 核心中的使用
Illuminate\Support\HtmlString实现了Htmlablee()辅助函数在参数是Htmlable时会返回其toHtml()(不再转义)
包开发中的应用要点
- 明确在 Blade 中安全传递 HTML 片段的职责边界
- 使用
{!! $obj !!}的场景中,也便于用对象管理输出
4) Responsable
接口定义
实现示例
在 Laravel 核心中的使用
Illuminate\Routing\Router::toResponse()会先判定Responsable,调用$response->toResponse($request)Illuminate\Http\Resources\Json\JsonResource实现了Responsable,Controller 中可以直接return UserResource::make($user);
包开发中的应用要点
- Controller 不再手动组数组,可以把响应生成委托给对象
- 更容易做「DTO 原样 return」的设计,将 HTTP 表现与领域表现分离
使用场景指南
1
想把数据转数组以便复用
实现
Arrayable,把规范化逻辑集中在 toArray()。2
想控制 JSON 表达
实现
Jsonable,用 toJson($options) 明确输出格式。3
想作为 HTML 片段处理
实现
Htmlable,用 toHtml() 返回渲染字符串。4
想直接返回 HTTP 响应
实现
Responsable,把职责集中到 toResponse($request)。接下来阅读
Macroable trait
学习向既有类添加自定义方法的扩展模式。
Conditionable trait
学习用
when() / unless() 组织条件分支的设计。tap() 辅助函数 / Tappable
学习插入副作用同时返回值的链式设计。
Dumpable trait
学习把
dump() / dd() 集成到对象中的调试方法。