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

> Découvrez la conception de Illuminate\Support\Traits\InteractsWithData et comment implémenter une API d'accès aux données pour vos propres classes lors du développement de packages.

## Qu'est-ce que le trait InteractsWithData

`Illuminate\Support\Traits\InteractsWithData` est un trait qui regroupe une « API commune pour des données d'entrée assimilables à un tableau ».

Ce trait n'exige que deux méthodes abstraites, `all()` et `data()`, et délègue la logique de récupération des données réelles à la classe qui l'utilise. En contrepartie, il fournit un ensemble de méthodes couramment utilisées :

* Vérification d'existence : `has()`, `hasAny()`, `exists()`, `missing()`
* Vérification de remplissage : `filled()`, `isNotFilled()`, `anyFilled()`
* Exécution conditionnelle : `whenHas()`, `whenFilled()`, `whenMissing()`
* Extraction : `only()`, `except()`
* Conversion de type : `string()`, `boolean()`, `integer()`, `float()`, `date()`, `enum()`, `collect()`

## Relation avec les méthodes de la Request

L'objet `Illuminate\Http\Request` obtenu via le helper `request()` intègre `InteractsWithData` via `Concerns\InteractsWithInput`.

Les accès quotidiens aux entrées sont donc fournis à travers ce trait :

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

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

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

`Request::get()` est une méthode compatible Symfony présente sur la classe `Request`. Dans le code source de Laravel 13, elle est explicitement marquée `@deprecated use ->input() instead` : la méthode recommandée est `input()`.

```php theme={null}
$legacy = request()->get('search');  // méthode conservée par compatibilité (input() recommandée)
```

## Principales utilisations dans le cœur de Laravel

### Classes utilisant directement `InteractsWithData`

| Classe                                        | Rôle                                                                       |
| --------------------------------------------- | -------------------------------------------------------------------------- |
| `Illuminate\Http\Concerns\InteractsWithInput` | API d'accès aux entrées de `Request`                                       |
| `Illuminate\Support\ValidatedInput`           | Wrapper renvoyé par `validated()` / `safe()`                               |
| `Illuminate\Support\Fluent`                   | Manipulation fluide de valeurs de configuration ou d'attributs arbitraires |
| `Illuminate\Support\UriQueryString`           | Manipulation de la chaîne de requête de `Uri`                              |
| `Illuminate\View\ComponentAttributeBag`       | Manipulation des attributs d'un composant Blade                            |

### Implémentations aux responsabilités voisines

* `Illuminate\Session\Store` implémente à sa manière une API similaire avec `has()`, `get()`, `only()`, `except()`, etc.
* `Illuminate\Validation\Concerns\ValidatesAttributes` fournit la logique de validation ; l'API d'accès aux entrées elle-même est conçue comme une responsabilité distincte de `InteractsWithData`.

## Relations entre le trait et les classes principales

```mermaid theme={null}
flowchart TD
    IWD["InteractsWithData<br>API commune d'accès aux données"] --> IWI["InteractsWithInput<br>trait Concern pour 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 d'API similaire.-> SES["Session Store<br>implémente has()/get()/only()/except() à sa manière"]
    REQ -.domaine connexe (pas de dépendance directe).-> VAL["ValidatesAttributes<br>logique de validation"]
```

## L'intégrer dans vos classes lors du développement d'un package

`InteractsWithData` convient parfaitement à une classe qui, dans votre package, doit « conserver un tableau d'entrée et exposer une API de récupération à la Laravel ».

<Steps>
  <Step title="Créer une classe conteneur de données">
    ```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="Lire de manière sûre avec des accesseurs typés">
    ```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']);          // exclut secret
    ```
  </Step>
</Steps>

## Cas d'utilisation concrets

* Sacs d'options pour clients d'API externes
* Couche de normalisation de payloads de webhooks
* Classe de résolution de surcharges de configuration de package

En n'implémentant que `all()` et `data()`, vous évitez de réécrire à chaque fois une API d'accès aux entrées, ce qui réduit les coûts de maintenance.

## Pages associées

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


## Related topics

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