> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Trait InteractsWithData

> Explica el diseño de Illuminate\Support\Traits\InteractsWithData y cómo implementar una API de acceso a datos en tus propias clases durante el desarrollo de paquetes.

## 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.

```php theme={null}
$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()`.

```php theme={null}
$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`

| Clase                                         | Uso                                                                        |
| --------------------------------------------- | -------------------------------------------------------------------------- |
| `Illuminate\Http\Concerns\InteractsWithInput` | API de acceso a la entrada de `Request`.                                   |
| `Illuminate\Support\ValidatedInput`           | Wrapper del retorno de `validated()` / `safe()`.                           |
| `Illuminate\Support\Fluent`                   | Operaciones fluent sobre valores de configuración o atributos arbitrarios. |
| `Illuminate\Support\UriQueryString`           | Operaciones sobre la query string de `Uri`.                                |
| `Illuminate\View\ComponentAttributeBag`       | Operaciones 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

```mermaid theme={null}
flowchart TD
    IWD["InteractsWithData<br>API común de acceso a datos"] --> IWI["InteractsWithInput<br>Trait Concern para Request"]
    IWI --> REQ["Request<br>input()/has()/only()/except()"]
    IWD --> VIN["ValidatedInput<br>safe()/validated()"]
    IWD --> FLU["Fluent"]
    IWD --> UQS["UriQueryString"]
    IWD --> CAB["ComponentAttributeBag"]
    REQ -.Patrón de API similar.-> SES["Session Store<br>implementa has()/get()/only()/except() por su cuenta"]
    REQ -.Área relacionada (sin dependencia directa).-> VAL["ValidatesAttributes<br>lógica de comprobación de validación"]
```

## 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».

<Steps>
  <Step title="Crea la clase contenedora de datos">
    ```php theme={null}
    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);
        }
    }
    ```
  </Step>

  <Step title="Lee con seguridad usando accesores tipados">
    ```php theme={null}
    $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"
    ```
  </Step>
</Steps>

## 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

* [Trait Macroable](/es/advanced/macroable)
* [Trait Conditionable](/es/advanced/conditionable)
* [Helper tap() y trait Tappable](/es/advanced/tap)


## Related topics

- [SessionEvent](/es/packages/laravel-copilot-sdk/session-event.md)
- [Trait InteractsWithTime](/es/advanced/interacts-with-time.md)
- [Clase Fluent](/es/advanced/fluent.md)
- [Broadcasting](/es/broadcasting.md)
- [Atributos de PHP](/es/advanced/php-attributes.md)
