Support Contractsとは
Illuminate\Contracts\Support には、Laravel全体で使われる小さく重要なインターフェースが集まっています。とくに
Arrayable / Jsonable / Htmlable / Responsable は、Value Object・DTO・レスポンスオブジェクトを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をコントローラー・リソース・ログ出力で共通フォーマット化できる
arrayへの変換責務をオブジェクト側に閉じ込められる
2) Jsonable
インターフェース定義
実装例
Laravelコアでの使用例
ModelはJsonableも実装し、toJson($options = 0)を提供JsonResponse::setData()はJsonableを最優先で判定してtoJson()を使う
パッケージ開発での活用ポイント
- 監査ログ・Webhook送信などでJSON構造を厳密に固定できる
json_encode()側に任せず、ドメイン都合のJSON表現を明示できる
3) Htmlable
インターフェース定義
実装例
Laravelコアでの使用例
Illuminate\Support\HtmlStringはHtmlableを実装e()ヘルパーは引数がHtmlableの場合toHtml()を返す(再エスケープしない)
パッケージ開発での活用ポイント
- Blade内で安全にHTML断片を渡す責務境界を明確にできる
{!! $obj !!}を使う場面でも、出力をオブジェクトで管理しやすい
4) Responsable
インターフェース定義
実装例
Laravelコアでの使用例
Illuminate\Routing\Router::toResponse()は最初にResponsableを判定し、$response->toResponse($request)を呼び出すIlluminate\Http\Resources\Json\JsonResourceはResponsableを実装しており、コントローラーから直接return UserResource::make($user);が可能
パッケージ開発での活用ポイント
- コントローラーで配列組み立てをせず、レスポンス生成をオブジェクトへ移譲できる
- 「DTOをそのままreturn」する設計にしやすく、HTTP表現とドメイン表現を分離しやすい
実装の使い分けガイド
1
データを配列化して再利用したい
Arrayable を実装し、toArray() に正規化ロジックを集約します。2
JSON表現を制御したい
Jsonable を実装し、toJson($options) で出力形式を明示します。3
HTML断片として扱いたい
Htmlable を実装し、toHtml() でレンダリング文字列を返します。4
HTTPレスポンスを直接返したい
Responsable を実装し、toResponse($request) へ責務を集約します。次に読むページ
Macroableトレイト
既存クラスに独自メソッドを追加する拡張パターンを学びます。
Conditionableトレイト
when() / unless() で条件分岐を組み込む設計を学びます。tap() ヘルパー / Tappable
副作用を挟みつつ値を返すチェーン設計を学びます。
Dumpableトレイト
dump() / dd() をオブジェクトへ組み込むデバッグ手法を学びます。