Zum Hauptinhalt springen

Ziel dieser Seite

Diese Seite erklärt nicht die Verwendung von collect(), 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 von LazyCollection grundlegend neu geordnet.

Bis Laravel 5.8

  • Illuminate\Support\Collection
  • Illuminate\Database\Eloquent\Collection (erbt von Collection)
Zu diesem Zeitpunkt gab es LazyCollection, Enumerable und EnumeratesValues noch nicht.

Änderungen in Laravel 6.0

Passend zum neuen LazyCollection 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

/**
 * @template TKey of array-key
 * @template-covariant TValue
 * @implements \Illuminate\Support\Enumerable<TKey, TValue>
 */
class Collection implements Enumerable
{
    /**
     * @use \Illuminate\Support\Traits\EnumeratesValues<TKey, TValue>
     */
    use EnumeratesValues;
}
NotationBedeutung
@template TKey of array-keySchränkt den Schlüsseltyp auf int|string ein
@template-covariant TValueBehandelt 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

/**
 * @template TKey of array-key
 * @template TModel of \Illuminate\Database\Eloquent\Model
 * @extends \Illuminate\Support\Collection<TKey, TModel>
 */
class Collection extends BaseCollection
{
}
Da 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 aus
  • LazyCollection: verwendet einen Generator und wertet verzögert aus
Auch bei gleichnamigen Methoden unterscheiden sich Auswertungszeitpunkt und Speicherverhalten.

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.
Wenn Sie eine Methode im Detail nachverfolgen, gehen Sie in der Reihenfolge Deklaration in Enumerable → Kern in EnumeratesValues → gegebenenfalls Override in Collection / LazyCollection vor — so verlieren Sie den Faden nicht.

Verwandte Seiten

Zuletzt geändert am 13. Juli 2026