什麼是 Support Contracts
Illuminate\Contracts\Support 彙集了於整個 Laravel 中使用的小巧但重要的介面。
特別是 Arrayable / Jsonable / Htmlable / Responsable,是將 Value Object、DTO、Response 物件自然融入 Laravel 既有流程的基本模式。
此處使用的簽章參照 Laravel 13.x 的官方原始碼(
laravel/framework)。1) Arrayable
介面定義
實作範例
Laravel Core 的使用範例
Illuminate\Database\Eloquent\Model實作Arrayable,提供toArray()Illuminate\Http\JsonResponse::setData()偵測到Arrayable時,以json_encode($data->toArray(), ...)序列化
套件開發的活用要點
- 可將 DTO 或 Value Object 於 Controller、Resource、Log 輸出中共同格式化
- 可將轉換為
array的職責收斂於物件端
2) Jsonable
介面定義
實作範例
Laravel Core 的使用範例
Model也實作了Jsonable,提供toJson($options = 0)JsonResponse::setData()會最優先判定Jsonable並使用toJson()
套件開發的活用要點
- 於稽核日誌、Webhook 傳送等場合可嚴格固定 JSON 結構
- 不交由
json_encode(),可明確表達領域面的 JSON 表現
3) Htmlable
介面定義
實作範例
Laravel Core 的使用範例
Illuminate\Support\HtmlString實作了Htmlablee()helper 若引數為Htmlable,會回傳toHtml()(不重新 escape)
套件開發的活用要點
- 於 Blade 中安全傳遞 HTML 片段的職責邊界更清晰
- 即便於使用
{!! $obj !!}的場合,也易於以物件管理輸出
4) Responsable
介面定義
實作範例
Laravel Core 的使用範例
Illuminate\Routing\Router::toResponse()會先判定Responsable,呼叫$response->toResponse($request)Illuminate\Http\Resources\Json\JsonResource實作了Responsable,因此可從 Controller 直接return UserResource::make($user);
套件開發的活用要點
- 於 Controller 中不需自行組陣列,可將 Response 的生成委派給物件
- 便於「直接 return DTO」的設計,容易分離 HTTP 表現與領域表現
實作選擇指南
1
希望將資料陣列化並重複利用
實作
Arrayable,將正規化邏輯集中於 toArray()。2
希望控制 JSON 表現
實作
Jsonable,於 toJson($options) 明確輸出格式。3
希望作為 HTML 片段處理
實作
Htmlable,於 toHtml() 回傳渲染字串。4
希望直接回傳 HTTP Response
實作
Responsable,將職責集中於 toResponse($request)。下一步閱讀
Macroable trait
學習為既有類別加入自訂方法的擴充模式。
Conditionable trait
學習以
when() / unless() 組入條件分支的設計。tap() helper / Tappable
學習於插入副作用同時回傳值的鏈式設計。
Dumpable trait
學習將
dump() / dd() 組入物件的除錯方法。