Was sind die Support Contracts?
Illuminate\Contracts\Support versammelt eine Reihe kleiner, aber wichtiger Interfaces, die überall in Laravel verwendet werden.Vor allem
Arrayable, Jsonable, Htmlable und Responsable sind Basismuster, um Value Objects, DTOs und Response-Objekte natürlich in die bestehenden Laravel-Flüsse einzupassen.
Die Signaturen basieren auf dem offiziellen Quellcode von Laravel 13.x (
laravel/framework).1) Arrayable
Interface-Definition
Beispielimplementierung
Verwendung im Laravel-Kern
Illuminate\Database\Eloquent\ModelimplementiertArrayableund stellttoArray()bereit.Illuminate\Http\JsonResponse::setData()erkenntArrayableund serialisiert perjson_encode($data->toArray(), ...).
Nutzen in der Paketentwicklung
- DTOs und Value Objects erhalten ein einheitliches Format für Controller, Resources und Log-Ausgabe.
- Die Verantwortung für die Umwandlung in ein Array bleibt im Objekt gekapselt.
2) Jsonable
Interface-Definition
Beispielimplementierung
Verwendung im Laravel-Kern
Modelimplementiert zusätzlichJsonableund lieferttoJson($options = 0).JsonResponse::setData()prüftJsonablebevorzugt und verwendettoJson().
Nutzen in der Paketentwicklung
- JSON-Strukturen für Audit-Logs oder Webhook-Auslieferungen lassen sich fest definieren.
- Sie überlassen die JSON-Repräsentation nicht
json_encode(), sondern drücken sie domänenspezifisch aus.
3) Htmlable
Interface-Definition
Beispielimplementierung
Verwendung im Laravel-Kern
Illuminate\Support\HtmlStringimplementiertHtmlable.- Der Helper
e()gibt bei einemHtmlable-ArgumenttoHtml()zurück (ohne erneute Escapes).
Nutzen in der Paketentwicklung
- Sie erhalten klare Verantwortungs-Grenzen, um HTML-Fragmente sicher an Blade zu übergeben.
- Auch bei
{!! $obj !!}lässt sich die Ausgabe objektorientiert verwalten.
4) Responsable
Interface-Definition
Beispielimplementierung
Verwendung im Laravel-Kern
Illuminate\Routing\Router::toResponse()prüft zunächst aufResponsableund ruft$response->toResponse($request)auf.Illuminate\Http\Resources\Json\JsonResourceimplementiertResponsable, sodass ein Controller direktreturn UserResource::make($user);schreiben kann.
Nutzen in der Paketentwicklung
- Statt in Controllern Arrays zusammenzubauen, delegieren Sie die Response-Erzeugung ans Objekt.
- Ein Design, das „DTOs direkt returned”, trennt HTTP- von Domänen-Repräsentation.
Wann welche Implementierung?
Daten in ein Array umwandeln und wiederverwenden
Arrayable implementieren; die Normalisierungslogik bündelt sich in toArray().JSON-Repräsentation kontrollieren
Jsonable implementieren; über toJson($options) legen Sie das Ausgabeformat fest.Weiterführende Seiten
Macroable-Trait
Lernen Sie das Erweiterungsmuster kennen, um bestehenden Klassen eigene Methoden hinzuzufügen.
Conditionable-Trait
Lernen Sie das Design von Bedingungs-Chains mit
when() / unless().tap()-Helper / Tappable
Lernen Sie die Chain-Muster für Seiteneffekte kennen, die den Wert weiter durchreichen.
Dumpable-Trait
Lernen Sie die Debug-Technik,
dump() / dd() in Objekte einzubetten.