고차 메시지란
고차 메시지(Higher-order Messages)는 컬렉션의 메서드를 프로퍼티 접근 형태로 호출하는 구문입니다. 콜백을 작성하지 않고도, 각 요소에 대해 메서드를 호출하거나 프로퍼티를 가져올 수 있습니다.$users->map->name은 “각 유저의 name 프로퍼티를 꺼내 map한다”는 의미가 됩니다.
구조 — HigherOrderCollectionProxy
$collection->map과 같이 프로퍼티로 접근하면, EnumeratesValues 트레이트의 __get()이 호출됩니다.
$proxies에 포함된 메서드명인 경우, HigherOrderCollectionProxy 인스턴스가 반환됩니다. 이 프록시는 컬렉션과 메서드명 두 가지를 보관합니다.
__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나 자체 클래스에의 적용 방법을 배웁니다.