什麼是 InteractsWithData trait
Illuminate\Support\Traits\InteractsWithData 是彙整了「對於類陣列輸入資料的共通 API」的 trait。
此 trait 本身僅要求 all() 與 data() 兩個抽象方法,將實際資料的取得邏輯委派給各類別。取而代之,其提供如下的高頻使用方法。
- 存在判定:
has(),hasAny(),exists(),missing() - 空判定:
filled(),isNotFilled(),anyFilled() - 條件執行:
whenHas(),whenFilled(),whenMissing() - 擷取:
only(),except() - 型別轉換:
string(),boolean(),integer(),float(),date(),enum(),collect()
與 Request 系方法的關係
以request() helper 取得的 Illuminate\Http\Request,透過 Concerns\InteractsWithInput 引入 InteractsWithData。
因此下列日常的輸入存取都經由 trait 提供。
Request::get() 是位於 Request 類別本體的 Symfony 相容方法。於 Laravel 13 的原始碼上也明確標示 @deprecated use ->input() instead,建議使用 input()。
Laravel Core 的主要實作範例
直接 use InteractsWithData 的類別
具相近職責的相關實作
Illuminate\Session\Store自行實作了has(),get(),only(),except()等相近 APIIlluminate\Validation\Concerns\ValidatesAttributes提供驗證判斷邏輯,輸入存取 API 本身於設計上與InteractsWithData分屬不同職責
trait 與主要類別的關係
於套件開發中整合至自訂類別
InteractsWithData 適用於套件內「保持輸入陣列並提供 Laravel 風格取得 API」的類別。
1
建立資料容器類別
2
以型別化的存取子安全讀取
實務使用情境
- 外部 API Client 的選項 bag
- Webhook payload 的正規化層
- 套件的設定 override 解析類別
all() 與 data(),就無需每次自行撰寫輸入存取 API,可降低維護成本。