メインコンテンツへスキップ

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トレイトとは

Illuminate\Support\Traits\InteractsWithData は、「配列ライクな入力データに対する共通API」をまとめたトレイトです。 このトレイト自体は all()data() の2つだけを抽象メソッドとして要求し、実データの取得ロジックは各クラス側に委譲します。代わりに、以下のような高頻度メソッドをまとめて提供します。
  • 存在判定: has(), hasAny(), exists(), missing()
  • 空判定: filled(), isNotFilled(), anyFilled()
  • 条件実行: whenHas(), whenFilled(), whenMissing()
  • 抽出: only(), except()
  • 型変換: string(), boolean(), integer(), float(), date(), enum(), collect()

Request系メソッドとの関係

request() ヘルパーで取得する Illuminate\Http\Request は、Concerns\InteractsWithInput を通して InteractsWithData を取り込みます。 そのため、次のような日常的な入力アクセスはトレイト経由で提供されています。
$search = request()->input('search');

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

$payload = request()->except(['_token']);
Request::get()Request クラス本体にある Symfony 互換メソッドです。Laravel 13 のソースコード上でも @deprecated use ->input() instead と明記され、推奨は input() です。
$legacy = request()->get('search');  // 互換目的のメソッド(推奨は input())

Laravelコアでの主な実装例

直接 InteractsWithData を use するクラス

クラス用途
Illuminate\Http\Concerns\InteractsWithInputRequest の入力アクセスAPI
Illuminate\Support\ValidatedInputvalidated() / safe() の戻り値ラッパー
Illuminate\Support\Fluent設定値や任意属性のフルーエント操作
Illuminate\Support\UriQueryStringUri のクエリ文字列操作
Illuminate\View\ComponentAttributeBagBladeコンポーネント属性の操作

近い責務を持つ関連実装

  • Illuminate\Session\Storehas(), get(), only(), except() など似たAPIを独自実装しています
  • Illuminate\Validation\Concerns\ValidatesAttributes はバリデーション判定ロジックを提供し、入力アクセスAPIそのものは InteractsWithData とは別責務で設計されています

トレイトと主要クラスの関係

パッケージ開発で自前クラスに組み込む

InteractsWithData は、パッケージ内で「入力配列を保持し、Laravel風の取得APIを提供したい」クラスに向いています。
1

データコンテナクラスを作る

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

型付きアクセサで安全に読む

$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 を除外

実践ユースケース

  • 外部APIクライアントのオプションバッグ
  • Webhookペイロードの正規化レイヤー
  • パッケージの設定オーバーライド解決クラス
all()data() だけ実装すれば、入力アクセスAPIを毎回自作せずに済むため、メンテナンスコストを下げられます。

関連ページ

Last modified on April 18, 2026