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

> Il design di Illuminate\Support\Traits\InteractsWithData e come implementare API di accesso ai dati in classi proprie durante lo sviluppo di pacchetti.

## Cos'è il trait InteractsWithData

`Illuminate\Support\Traits\InteractsWithData` è un trait che raccoglie "un'API comune per dati di input di tipo array-like".

Il trait richiede come metodi astratti solo `all()` e `data()` e delega la logica di recupero dei dati effettivi a ciascuna classe. In cambio fornisce, tutti insieme, i metodi di uso frequente elencati sotto.

* Verifica di esistenza: `has()`, `hasAny()`, `exists()`, `missing()`
* Verifica di valorizzazione: `filled()`, `isNotFilled()`, `anyFilled()`
* Esecuzione condizionata: `whenHas()`, `whenFilled()`, `whenMissing()`
* Estrazione: `only()`, `except()`
* Conversione di tipo: `string()`, `boolean()`, `integer()`, `float()`, `date()`, `enum()`, `collect()`

## Relazione con i metodi di Request

L'`Illuminate\Http\Request` che ottieni dall'helper `request()` incorpora `InteractsWithData` tramite `Concerns\InteractsWithInput`.

Per questo motivo, i seguenti accessi quotidiani agli input sono forniti attraverso il trait.

```php theme={null}
$search = request()->input('search');

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

$payload = request()->except(['_token']);
```

`Request::get()` è un metodo compatibile con Symfony che risiede nella classe `Request` stessa. Anche nel codice sorgente di Laravel 13 è annotato con `@deprecated use ->input() instead` e la raccomandazione è `input()`.

```php theme={null}
$legacy = request()->get('search');  // metodo per compatibilità (consigliato input())
```

## Principali implementazioni nel core di Laravel

### Classi che usano direttamente `InteractsWithData`

| Classe                                        | Scopo                                                                  |
| --------------------------------------------- | ---------------------------------------------------------------------- |
| `Illuminate\Http\Concerns\InteractsWithInput` | API di accesso agli input di `Request`                                 |
| `Illuminate\Support\ValidatedInput`           | Wrapper del valore di ritorno di `validated()` / `safe()`              |
| `Illuminate\Support\Fluent`                   | Manipolazione fluent di valori di configurazione o attributi arbitrari |
| `Illuminate\Support\UriQueryString`           | Manipolazione della query string di `Uri`                              |
| `Illuminate\View\ComponentAttributeBag`       | Manipolazione degli attributi dei componenti Blade                     |

### Implementazioni con responsabilità simili

* `Illuminate\Session\Store` implementa autonomamente API analoghe come `has()`, `get()`, `only()`, `except()`
* `Illuminate\Validation\Concerns\ValidatesAttributes` fornisce la logica di validazione: l'API di accesso agli input è progettata come responsabilità separata da `InteractsWithData`

## Relazione tra il trait e le classi principali

```mermaid theme={null}
flowchart TD
    IWD["InteractsWithData<br>API comune di accesso ai dati"] --> IWI["InteractsWithInput<br>Trait Concern per 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 -.pattern di API simile.-> SES["Session Store<br>has()/get()/only()/except() implementati a parte"]
    REQ -.area correlata (non dipendenza diretta).-> VAL["ValidatesAttributes<br>Logica di validazione"]
```

## Integrarlo in una tua classe durante lo sviluppo di un pacchetto

`InteractsWithData` è adatto a classi di un pacchetto che devono "trattenere un array di input e offrire un'API di accesso in stile Laravel".

<Steps>
  <Step title="Crea una classe container per i dati">
    ```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="Leggi in sicurezza con accessor tipizzati">
    ```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']);          // esclude secret
    ```
  </Step>
</Steps>

## Casi d'uso pratici

* Option bag per client di API esterne
* Livello di normalizzazione dei payload webhook
* Classe di risoluzione degli override di configurazione del pacchetto

Implementando solo `all()` e `data()` eviti di riscrivere ogni volta l'API di accesso agli input, riducendo i costi di manutenzione.

## Pagine correlate

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


## Related topics

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