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

# InteractsWithData-trait

> Leer het ontwerp van Illuminate\Support\Traits\InteractsWithData en hoe je in pakketontwikkeling een data-access-API implementeert in je eigen klassen.

## Wat is de InteractsWithData-trait

`Illuminate\Support\Traits\InteractsWithData` is een trait die "een gemeenschappelijke API voor array-achtige invoerdata" bundelt.

De trait zelf vereist slechts twee abstracte methodes, `all()` en `data()`, en delegeert de logica voor het ophalen van de echte data aan elke klasse. In ruil daarvoor levert hij een verzameling veelgebruikte methodes:

* Bestaanscontrole: `has()`, `hasAny()`, `exists()`, `missing()`
* Leegtecontrole: `filled()`, `isNotFilled()`, `anyFilled()`
* Voorwaardelijke uitvoering: `whenHas()`, `whenFilled()`, `whenMissing()`
* Extractie: `only()`, `except()`
* Typeconversie: `string()`, `boolean()`, `integer()`, `float()`, `date()`, `enum()`, `collect()`

## Relatie met de Request-methodes

De `Illuminate\Http\Request` die je via de `request()`-helper krijgt, neemt `InteractsWithData` op via `Concerns\InteractsWithInput`.

Daardoor wordt alledaagse toegang tot invoer zoals hieronder via de trait geleverd.

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

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

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

`Request::get()` is een Symfony-compatibele methode op de `Request`-klasse zelf. Ook in de broncode van Laravel 13 staat expliciet `@deprecated use ->input() instead`; de aanbevolen methode is `input()`.

```php theme={null}
$legacy = request()->get('search');  // Compatibiliteitsmethode (aanbevolen is input())
```

## Belangrijkste implementaties in de Laravel-core

### Klassen die `InteractsWithData` rechtstreeks gebruiken

| Klasse                                        | Doel                                                               |
| --------------------------------------------- | ------------------------------------------------------------------ |
| `Illuminate\Http\Concerns\InteractsWithInput` | Invoertoegangs-API van `Request`                                   |
| `Illuminate\Support\ValidatedInput`           | Wrapper voor de returnwaarde van `validated()` / `safe()`          |
| `Illuminate\Support\Fluent`                   | Fluent bewerken van configuratiewaarden en willekeurige attributen |
| `Illuminate\Support\UriQueryString`           | Querystring-bewerkingen van `Uri`                                  |
| `Illuminate\View\ComponentAttributeBag`       | Bewerken van Blade-componentattributen                             |

### Verwante implementaties met vergelijkbare verantwoordelijkheden

* `Illuminate\Session\Store` implementeert zelf een vergelijkbare API met `has()`, `get()`, `only()`, `except()` enzovoort
* `Illuminate\Validation\Concerns\ValidatesAttributes` levert de validatielogica; de invoertoegangs-API zelf is als een aparte verantwoordelijkheid van `InteractsWithData` ontworpen

## Relatie tussen de trait en de belangrijkste klassen

```mermaid theme={null}
flowchart TD
    IWD["InteractsWithData<br>Gemeenschappelijke data-access-API"] --> IWI["InteractsWithInput<br>Concern-trait voor 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 -.vergelijkbaar API-patroon.-> SES["Session Store<br>eigen implementatie van has()/get()/only()/except()"]
    REQ -.verwant gebied (geen directe afhankelijkheid).-> VAL["ValidatesAttributes<br>validatielogica"]
```

## Inbouwen in eigen klassen bij pakketontwikkeling

`InteractsWithData` is geschikt voor klassen in een pakket die "een invoerarray bewaren en een Laravel-achtige ophaal-API willen bieden".

<Steps>
  <Step title="Maak een datacontainerklasse">
    ```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="Lees veilig met getypeerde accessors">
    ```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']);          // secret uitsluiten
    ```
  </Step>
</Steps>

## Praktische use cases

* Een option bag voor een externe API-client
* Een normalisatielaag voor webhook-payloads
* Een klasse die configuratie-overrides van een pakket oplost

Als je alleen `all()` en `data()` implementeert, hoef je de invoertoegangs-API niet telkens zelf te bouwen en houd je de onderhoudskosten laag.

## Gerelateerde pagina's

* [Macroable-trait](/nl/advanced/macroable)
* [Conditionable-trait](/nl/advanced/conditionable)
* [tap()-helper en Tappable-trait](/nl/advanced/tap)


## Related topics

- [InteractsWithTime-trait](/nl/advanced/interacts-with-time.md)
- [进阶主题](/zh-CN/advanced/index.md)
- [SessionEvent](/nl/packages/laravel-copilot-sdk/session-event.md)
- [Fluent-klasse](/nl/advanced/fluent.md)
- [Broadcasting](/nl/broadcasting.md)
