Objetivo de esta página
Esta página no cubre cómo usarcollect(), sino que ofrece un mapa para leer el código de implementación del propio Laravel.
Está dirigida a quienes ya conocen la lista de métodos de Collection y quieren entender por qué el diseño es como es.
Evolución histórica
La estructura de Collection se reorganizó de forma importante con la introducción deLazyCollection.
Hasta Laravel 5.8
Illuminate\Support\CollectionIlluminate\Database\Eloquent\Collection(extiendeCollection)
LazyCollection, Enumerable ni EnumeratesValues.
Cambios en Laravel 6.0
Con la incorporación deLazyCollection, la API común se separó en Enumerable (interfaz) y EnumeratesValues (trait).
Estructura general actual (Laravel 13)
Referencia: laravel/framework v13.x
La ruta real actual de los archivos es
src/Illuminate/Collections/*, pero el namespace se mantiene como Illuminate\Support. Al leer el código, ten en cuenta que la «ruta» y el «namespace» son cosas distintas.Generics al estilo PHPDoc y PHPStan
PHP nativo no tiene genéricos. Aun así, en el código de Collection se expresa información de tipos muy rica mediante PHPDoc. Persigue dos objetivos principales:- Que el autocompletado del IDE sea preciso.
- Aumentar la precisión de los analizadores estáticos como PHPStan / Larastan.
Notaciones frecuentes
| Notación | Significado |
|---|---|
@template TKey of array-key | Restringe el tipo de la clave a int|string. |
@template-covariant TValue | Trata el tipo del valor como covariante (permite sustituirlo con seguridad por un tipo más concreto). |
@implements ...<TKey, TValue> | Pasa los tipos genéricos a la interfaz implementada. |
@extends ...<TKey, TModel> | Declara los argumentos de tipo al heredar de una clase padre. |
@use ...<TKey, TValue> | Declara los argumentos de tipo al aplicar un trait. |
Cómo se ve en la Collection de Eloquent
TValue se concreta como TModel, la inferencia de tipos de map(), filter(), etc., se refuerza orientándose a los modelos Eloquent.
Orden recomendado para leer el código
1. Empieza por Enumerable
Primero, entiende «qué contrato define». Conocer la lista de métodos aquí acelera la lectura del resto de la implementación.
2. Sigue los métodos comunes en EnumeratesValues
Muchos métodos comunes como map, filter o reduce están aquí. Si dejas para después solo las diferencias entre Collection y LazyCollection, evitarás lecturas redundantes.
3. Mira las diferencias entre Collection y LazyCollection
Collection: guarda un array y evalúa de forma inmediata.LazyCollection: usa unGeneratory evalúa de forma perezosa.
4. Por último, lee Eloquent\Collection
Céntrate en las extensiones específicas para conjuntos de modelos como find, load o modelKeys. Si la lees después de comprender la Collection base, entenderás mejor su intención.