Qué son los Support Contracts
Illuminate\Contracts\Support reúne interfaces pequeñas pero importantes que Laravel usa en todas partes.
En particular, Arrayable / Jsonable / Htmlable / Responsable son los patrones básicos para integrar de forma natural Value Objects, DTOs y objetos de respuesta en los flujos existentes de Laravel.
Las firmas mostradas aquí se basan en el código fuente oficial (
laravel/framework) de Laravel 13.x.1) Arrayable
Definición de la interfaz
Ejemplo de implementación
Ejemplos en el core de Laravel
Illuminate\Database\Eloquent\ModelimplementaArrayabley ofrecetoArray().Illuminate\Http\JsonResponse::setData()detectaArrayabley serializa conjson_encode($data->toArray(), ...).
Uso en el desarrollo de paquetes
- Puedes unificar el formato de DTOs y Value Objects en controladores, resources y logs.
- La responsabilidad de la conversión a
arrayqueda dentro del propio objeto.
2) Jsonable
Definición de la interfaz
Ejemplo de implementación
Ejemplos en el core de Laravel
Modeltambién implementaJsonabley ofrecetoJson($options = 0).JsonResponse::setData()priorizaJsonabley usa sutoJson().
Uso en el desarrollo de paquetes
- Puedes fijar estrictamente la estructura JSON en audit logs y webhooks.
- Explicitas la representación JSON según las necesidades de dominio en vez de delegarla en
json_encode().
3) Htmlable
Definición de la interfaz
Ejemplo de implementación
Ejemplos en el core de Laravel
Illuminate\Support\HtmlStringimplementaHtmlable.- El helper
e()devuelvetoHtml()cuando el argumento esHtmlable(no vuelve a escapar).
Uso en el desarrollo de paquetes
- Aclara la frontera de responsabilidad al pasar fragmentos de HTML seguros dentro de Blade.
- Aunque uses
{!! $obj !!}, es más fácil gestionar la salida con un objeto.
4) Responsable
Definición de la interfaz
Ejemplo de implementación
Ejemplos en el core de Laravel
Illuminate\Routing\Router::toResponse()detecta primeroResponsablee invoca$response->toResponse($request).Illuminate\Http\Resources\Json\JsonResourceimplementaResponsable, por lo que puedes hacerreturn UserResource::make($user);directamente desde un controlador.
Uso en el desarrollo de paquetes
- Delegas la construcción de la respuesta en un objeto en lugar de armar arrays en el controlador.
- Facilita el diseño «devuelvo el DTO tal cual», separando la representación HTTP de la de dominio.
Guía para elegir la implementación
Quieres reutilizar los datos como array
Implementa
Arrayable y concentra la lógica de normalización en toArray().Quieres controlar la representación JSON
Implementa
Jsonable y explicita el formato de salida en toJson($options).Siguientes lecturas
Trait Macroable
Aprende el patrón para extender clases existentes con métodos propios.
Trait Conditionable
Diseño de bifurcaciones condicionales con
when() / unless().Helper tap() / Tappable
Cadenas que devuelven el valor mientras intercalan efectos colaterales.
Trait Dumpable
Técnicas de depuración integrando
dump() / dd() en tus objetos.