Scopo di questa pagina
Questa pagina non spiega come usarecollect(): fornisce una mappa per leggere il codice di implementazione del core di Laravel.
Il pubblico è chi conosce già l’elenco dei metodi di Collection e vuole ora capire “perché questo design”.
Evoluzione storica
La struttura di Collection è stata riorganizzata in modo significativo con l’introduzione diLazyCollection.
Fino a Laravel 5.8
Illuminate\Support\CollectionIlluminate\Database\Eloquent\Collection(estendeCollection)
LazyCollection, Enumerable e EnumeratesValues.
Modifiche in Laravel 6.0
In concomitanza con l’aggiunta diLazyCollection, l’API comune è stata separata in Enumerable (interfaccia) ed EnumeratesValues (trait).
Struttura complessiva attuale (Laravel 13)
Riferimento: laravel/framework v13.x
Attualmente il path fisico dei file è
src/Illuminate/Collections/*, ma il namespace resta Illuminate\\Support. Quando leggi il codice, tieni distinti “path” e “namespace”.Generics stile PHPDoc / PHPStan
PHP di per sé non ha i generics. Nonostante ciò, attorno a Collection si esprime un’informazione di tipo forte tramite PHPDoc. Ci sono due obiettivi principali.- Ottenere un autocompletamento accurato nell’IDE
- Aumentare la precisione di analizzatori statici come PHPStan / Larastan
Notazioni ricorrenti
| Notazione | Significato |
|---|---|
@template TKey of array-key | Vincola il tipo della chiave a int|string |
@template-covariant TValue | Tratta il tipo del valore come covariante (facilita la sostituzione sicura con tipi più specifici) |
@implements ...<TKey, TValue> | Passa gli argomenti di tipo all’interfaccia implementata |
@extends ...<TKey, TModel> | Dichiara gli argomenti di tipo per l’ereditarietà dalla classe padre |
@use ...<TKey, TValue> | Dichiara gli argomenti di tipo quando si applica il trait |
Come appare nella Collection di Eloquent
TValue viene specializzato in TModel, quindi l’inferenza di tipo di map(), filter() e simili risulta più orientata ai modelli Eloquent.
Ordine con cui leggere l’implementazione
1. Parti da Enumerable come punto d’ingresso
Prima di tutto, cattura “qual è il contract che offre”.
Se qui memorizzi l’elenco dei metodi, la successiva lettura dell’implementazione sarà più veloce.
2. Segui i metodi comuni in EnumeratesValues
Gran parte della logica comune — map, filter, reduce — vive qui.
Se poi guardi solo le differenze tra Collection e LazyCollection, salterai meno passaggi.
3. Osserva le differenze tra Collection e LazyCollection
Collection: valutazione immediata mantenendo un arrayLazyCollection: valutazione pigra usandoGenerator
4. Da ultimo leggi Eloquent\Collection
Concentrati sulle estensioni per insiemi di modelli come find, load, modelKeys.
Se prima capisci la Collection di base, le intenzioni saranno più chiare.