Vai al contenuto principale

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.
$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().
$legacy = request()->get('search');  // metodo per compatibilità (consigliato input())

Principali implementazioni nel core di Laravel

Classi che usano direttamente InteractsWithData

ClasseScopo
Illuminate\Http\Concerns\InteractsWithInputAPI di accesso agli input di Request
Illuminate\Support\ValidatedInputWrapper del valore di ritorno di validated() / safe()
Illuminate\Support\FluentManipolazione fluent di valori di configurazione o attributi arbitrari
Illuminate\Support\UriQueryStringManipolazione della query string di Uri
Illuminate\View\ComponentAttributeBagManipolazione 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

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

Crea una classe container per i dati

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

Leggi in sicurezza con accessor tipizzati

$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

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

Ultima modifica il 13 luglio 2026