Doel van deze pagina
Deze pagina gaat niet over het gebruik vancollect(), maar biedt een kaart om de implementatiecode van Laravel zelf te lezen.
De doelgroep: mensen die de lijst met methodes van Collection al kennen en nu willen begrijpen “waarom het ontwerp zo is”.
Historische ontwikkeling
De structuur van Collections is flink herzien bij de introductie vanLazyCollection.
Tot Laravel 5.8
Illuminate\Support\CollectionIlluminate\Database\Eloquent\Collection(erft vanCollection)
LazyCollection, Enumerable en EnumeratesValues nog niet.
Wijzigingen in Laravel 6.0
Samen met de toevoeging vanLazyCollection is de gemeenschappelijke API afgesplitst naar Enumerable (interface) en EnumeratesValues (trait).
De huidige structuur (Laravel 13)
Zie: laravel/framework v13.x
Het huidige, werkelijke bestandspad is
src/Illuminate/Collections/*, maar de namespace is Illuminate\\Support gebleven. Houd bij het lezen van de code “pad” en “namespace” dus apart in de gaten.PHPDoc en generics in PHPStan-stijl
PHP zelf kent geen generics. Toch wordt rondom Collections sterke type-informatie uitgedrukt via PHPDoc. Daar zijn twee hoofddoelen mee gediend:- Nauwkeurige IDE-aanvulling
- Betere precisie van statische analyse met PHPStan / Larastan en dergelijke
Veelvoorkomende notaties
Hoe het eruitziet in de Eloquent Collection
TValue wordt geconcretiseerd naar TModel, wordt de type-inferentie van map(), filter() en dergelijke sterker toegespitst op Eloquent-modellen.
In welke volgorde je de implementatie leest
1. Begin bij Enumerable
Krijg eerst grip op “welk contract wordt er geboden”.
Als je hier het overzicht van methodes doorneemt, lees je de implementaties daarna sneller.
2. Volg de gemeenschappelijke methodes in EnumeratesValues
Veel gemeenschappelijke logica, zoals map, filter en reduce, staat hier.
Kijk je daarna alleen naar de verschillen tussen Collection en LazyCollection, dan sla je minder over.
3. Bekijk de verschillen tussen Collection en LazyCollection
Collection: houdt een array vast en evalueert directLazyCollection: evalueert lui met behulp van eenGenerator
4. Lees als laatste Eloquent\Collection
Concentreer je op de uitbreidingen voor verzamelingen van modellen, zoals find, load en modelKeys.
Lees je dit nadat je de basis-Collection begrijpt, dan zie je de bedoeling sneller.