高階メッセージとは
高階メッセージ(Higher-order Messages)は、コレクションのメソッドをプロパティアクセスの形で呼び出す構文です。コールバックを書くことなく、各要素に対してメソッドを呼び出したり、プロパティを取得したりできます。$users->map->name は「各ユーザーの name プロパティを取り出して map する」という意味になります。
仕組み — HigherOrderCollectionProxy
$collection->map のようにプロパティとしてアクセスすると、EnumeratesValues トレイトの __get() が呼ばれます。
$proxies に含まれるメソッド名の場合、HigherOrderCollectionProxy インスタンスが返ります。このプロキシはコレクションとメソッド名の2つを保持します。
__get によるプロパティアクセスのプロキシ
続けてプロパティにアクセス(->name)すると、プロキシの __get() が呼ばれます。
$users->map->name は次と同等です。
__call によるメソッド呼び出しのプロキシ
続けてメソッドを呼び出す(->activate())と、プロキシの __call() が呼ばれます。
$users->each->activate() は次と同等です。
対応しているメソッド一覧
高階メッセージとして使えるメソッドは$proxies 配列で定義されています。
Collection::proxy() を使います。
実践的なユースケース
Eloquentモデルのコレクション
高階メッセージはEloquentのコレクションで特に便利です。フィルタリング
集計
グループ化・ソート
flatMap でネストを展開
条件確認
文字列コレクション
値が文字列のコレクションでも使えます。プロキシの__call() は文字列の場合に静的メソッドとして呼び出します。
文字列コレクションへの高階メッセージは、メソッドが文字列型に静的に定義されている必要があります。通常はEloquentモデルや独自クラスのコレクションで使うのが自然です。
通常のクロージャとの比較
高階メッセージは簡潔ですが、すべてのケースで使えるわけではありません。カスタムクラスで高階メッセージを使う
EnumeratesValues トレイトを通じて HigherOrderCollectionProxy の仕組みを利用するには、Collection::proxy() を呼んでメソッドをプロキシ対象に追加します。
次のステップ
Conditionableトレイト
when() / unless() の内部実装と、QueryBuilderや自作クラスへの適用方法を学びます。