Saltar al contenido principal

Qué es el trait InteractsWithData

Illuminate\Support\Traits\InteractsWithData es un trait que reúne una «API común para trabajar con datos de entrada tipo array». Este trait solo requiere dos métodos abstractos (all() y data()) y delega la lógica de obtención de datos reales a cada clase. A cambio, ofrece de forma unificada métodos de uso frecuente como los siguientes:
  • Comprobación de existencia: has(), hasAny(), exists(), missing().
  • Comprobación de si está informado: filled(), isNotFilled(), anyFilled().
  • Ejecución condicional: whenHas(), whenFilled(), whenMissing().
  • Extracción: only(), except().
  • Conversión de tipos: string(), boolean(), integer(), float(), date(), enum(), collect().

Relación con los métodos de Request

El Illuminate\Http\Request que obtienes con el helper request() incorpora InteractsWithData a través de Concerns\InteractsWithInput. Por eso, accesos cotidianos a la entrada como estos se resuelven vía el trait.
$search = request()->input('search');

if (request()->has('search')) {
    $filters = request()->only(['search', 'status']);
}

$payload = request()->except(['_token']);
Request::get() es un método de compatibilidad con Symfony que existe en la propia clase Request. En el código fuente de Laravel 13 está marcado explícitamente como @deprecated use ->input() instead; se recomienda input().
$legacy = request()->get('search');  // método por compatibilidad (se recomienda input())

Principales ejemplos de uso en el core de Laravel

Clases que hacen use directamente de InteractsWithData

ClaseUso
Illuminate\Http\Concerns\InteractsWithInputAPI de acceso a la entrada de Request.
Illuminate\Support\ValidatedInputWrapper del retorno de validated() / safe().
Illuminate\Support\FluentOperaciones fluent sobre valores de configuración o atributos arbitrarios.
Illuminate\Support\UriQueryStringOperaciones sobre la query string de Uri.
Illuminate\View\ComponentAttributeBagOperaciones sobre los atributos de componentes Blade.

Implementaciones relacionadas con responsabilidad similar

  • Illuminate\Session\Store implementa por su cuenta APIs parecidas como has(), get(), only(), except().
  • Illuminate\Validation\Concerns\ValidatesAttributes ofrece la lógica de comprobación de validación; la API de acceso a la entrada en sí está diseñada como una responsabilidad separada de InteractsWithData.

Relación entre el trait y las clases principales

Integrarlo en tus propias clases al desarrollar paquetes

InteractsWithData es adecuado para clases dentro de un paquete que «guardan un array de entrada y quieren ofrecer una API de acceso al estilo Laravel».
1

Crea la clase contenedora de datos

namespace Vendor\Package\Support;

use Illuminate\Support\Arr;
use Illuminate\Support\Traits\InteractsWithData;

class OptionBag
{
    use InteractsWithData;

    /**
     * @param  array<string, mixed>  $items
     */
    public function __construct(
        protected array $items = [],
    ) {}

    public function all($keys = null): array
    {
        if (! $keys) {
            return $this->items;
        }

        $result = [];

        $keyList = is_array($keys) ? $keys : [$keys];

        foreach ($keyList as $key) {
            Arr::set($result, $key, Arr::get($this->items, $key));
        }

        return $result;
    }

    protected function data($key = null, $default = null): mixed
    {
        return data_get($this->items, $key, $default);
    }
}
2

Lee con seguridad usando accesores tipados

$options = new OptionBag([
    'feature.enabled' => 'true',
    'retry.max' => '5',
    'channels' => ['mail', 'slack'],
]);

$enabled = $options->boolean('feature.enabled'); // true
$retryMax = $options->integer('retry.max');      // 5
$channels = $options->collect('channels');       // Collection
$public = $options->except(['secret']);          // excluye "secret"

Casos de uso prácticos

  • Bolsa de opciones para un cliente de una API externa.
  • Capa de normalización de payloads de webhooks.
  • Clase que resuelve las sobrescrituras de configuración de un paquete.
Al implementar solo all() y data(), evitas rescribir cada vez la API de acceso a los datos de entrada, con lo que reduces el coste de mantenimiento.

Páginas relacionadas

Última modificación el 13 de julio de 2026