Skip to main content

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\ModelArrayable を実装し、toArray() を提供
  • Illuminate\Http\JsonResponse::setData()Arrayable を検出すると json_encode($data->toArray(), ...) でシリアライズ

パッケージ開発での活用ポイント

  • DTOやValue Objectをコントローラー・リソース・ログ出力で共通フォーマット化できる
  • array への変換責務をオブジェクト側に閉じ込められる

2) Jsonable

インターフェース定義

実装例

Laravelコアでの使用例

  • ModelJsonable も実装し、toJson($options = 0) を提供
  • JsonResponse::setData()Jsonable を最優先で判定して toJson() を使う

パッケージ開発での活用ポイント

  • 監査ログ・Webhook送信などでJSON構造を厳密に固定できる
  • json_encode() 側に任せず、ドメイン都合のJSON表現を明示できる

3) Htmlable

インターフェース定義

実装例

Laravelコアでの使用例

  • Illuminate\Support\HtmlStringHtmlable を実装
  • e() ヘルパーは引数が Htmlable の場合 toHtml() を返す(再エスケープしない)

パッケージ開発での活用ポイント

  • Blade内で安全にHTML断片を渡す責務境界を明確にできる
  • {!! $obj !!} を使う場面でも、出力をオブジェクトで管理しやすい
Htmlable を実装するクラス内では、ユーザー入力をそのまま連結せず、必要な値は e() でエスケープしてから埋め込んでください。

4) Responsable

インターフェース定義

実装例

Laravelコアでの使用例

  • Illuminate\Routing\Router::toResponse() は最初に Responsable を判定し、$response->toResponse($request) を呼び出す
  • Illuminate\Http\Resources\Json\JsonResourceResponsable を実装しており、コントローラーから直接 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() をオブジェクトへ組み込むデバッグ手法を学びます。
最終更新日 2026年5月25日