Passer au contenu principal

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 :
$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().
$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

ClasseRôle
Illuminate\Http\Concerns\InteractsWithInputAPI d’accès aux entrées de Request
Illuminate\Support\ValidatedInputWrapper renvoyé par validated() / safe()
Illuminate\Support\FluentManipulation fluide de valeurs de configuration ou d’attributs arbitraires
Illuminate\Support\UriQueryStringManipulation de la chaîne de requête de Uri
Illuminate\View\ComponentAttributeBagManipulation 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

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

Créer une classe conteneur de données

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

Lire de manière sûre avec des accesseurs typés

$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

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

Dernière modification le 13 juillet 2026