Ziel dieser Seite
Diese Seite erklärt nicht die Verwendung voncollect(), sondern liefert eine Karte, mit der Sie den Implementierungs-Code von Laravel selbst lesen können.
Zielgruppe sind Personen, die die Methodenliste von Collection bereits kennen und als Nächstes verstehen möchten, „warum es so entworfen ist”.
Historische Entwicklung
Die Struktur der Collection wurde bei der Einführung vonLazyCollection grundlegend neu geordnet.
Bis Laravel 5.8
Illuminate\Support\CollectionIlluminate\Database\Eloquent\Collection(erbt vonCollection)
LazyCollection, Enumerable und EnumeratesValues noch nicht.
Änderungen in Laravel 6.0
Passend zum neuenLazyCollection wurde die gemeinsame API in das Interface Enumerable und den Trait EnumeratesValues extrahiert.
Aktueller Gesamtaufbau (Laravel 13)
Referenz: laravel/framework v13.x
Der tatsächliche Dateipfad lautet inzwischen
src/Illuminate/Collections/*, aber der Namensraum bleibt weiterhin Illuminate\\Support. Beim Lesen des Codes sollten Sie „Pfad” und „Namespace” getrennt betrachten.PHPDoc und Generics im PHPStan-Stil
PHP selbst kennt keine Generics. Rund um die Collection werden dennoch mit PHPDoc präzise Typinformationen ausgedrückt. Die beiden Hauptziele sind:- die IDE-Vervollständigung genau zu machen
- die Präzision statischer Analyse (PHPStan / Larastan usw.) zu erhöhen
Häufig genutzte Notationen
| Notation | Bedeutung |
|---|---|
@template TKey of array-key | Schränkt den Schlüsseltyp auf int|string ein |
@template-covariant TValue | Behandelt den Werttyp kovariant (leichter sicher durch einen spezifischeren Typ zu ersetzen) |
@implements ...<TKey, TValue> | Übergibt Typargumente an das implementierte Interface |
@extends ...<TKey, TModel> | Deklariert Typargumente beim Erben von einer Elternklasse |
@use ...<TKey, TValue> | Deklariert Typargumente bei der Verwendung eines Traits |
Auftreten in der Eloquent Collection
TValue zu TModel konkretisiert wird, verbessert sich die Typinferenz von map(), filter() usw. speziell für Eloquent-Modelle.
Reihenfolge beim Lesen der Implementierung
1. Als Einstieg Enumerable lesen
Verstehen Sie zunächst, „was der Vertrag verspricht”.
Wenn Sie hier die Methodenliste erfassen, lesen sich die folgenden Implementierungen schneller.
2. Die gemeinsamen Methoden in EnumeratesValues verfolgen
Der Großteil der gemeinsamen Logik wie map, filter, reduce befindet sich hier.
Wenn Sie später nur die Unterschiede zwischen Collection und LazyCollection betrachten, überspringen Sie weniger.
3. Die Unterschiede zwischen Collection und LazyCollection betrachten
Collection: hält ein Array und wertet sofort ausLazyCollection: verwendet einenGeneratorund wertet verzögert aus
4. Zum Schluss Eloquent\Collection lesen
Konzentrieren Sie sich auf die Erweiterungen für Modell-Sammlungen wie find, load oder modelKeys.
Nach dem Verständnis der Basis-Collection erkennen Sie die Absicht leichter.