Skip to main content

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\Model implementa Arrayable y ofrece toArray().
  • Illuminate\Http\JsonResponse::setData() detecta Arrayable y serializa con json_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 array queda dentro del propio objeto.

2) Jsonable

Definición de la interfaz

Ejemplo de implementación

Ejemplos en el core de Laravel

  • Model también implementa Jsonable y ofrece toJson($options = 0).
  • JsonResponse::setData() prioriza Jsonable y usa su toJson().

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\HtmlString implementa Htmlable.
  • El helper e() devuelve toHtml() cuando el argumento es Htmlable (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.
Dentro de una clase que implementa Htmlable, no concatenes datos del usuario directamente: escápalos con e() antes de embutirlos.

4) Responsable

Definición de la interfaz

Ejemplo de implementación

Ejemplos en el core de Laravel

  • Illuminate\Routing\Router::toResponse() detecta primero Responsable e invoca $response->toResponse($request).
  • Illuminate\Http\Resources\Json\JsonResource implementa Responsable, por lo que puedes hacer return 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

1

Quieres reutilizar los datos como array

Implementa Arrayable y concentra la lógica de normalización en toArray().
2

Quieres controlar la representación JSON

Implementa Jsonable y explicita el formato de salida en toJson($options).
3

Quieres tratarlo como fragmento HTML

Implementa Htmlable y devuelve el markup en toHtml().
4

Quieres devolver directamente una respuesta HTTP

Implementa Responsable y concentra la responsabilidad en toResponse($request).

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.
Última modificación el 13 de julio de 2026