Skip to main content

Was sind API-Ressourcen?

Beim Aufbau einer API führt das direkte Ausliefern von Eloquent-Modellen als JSON schnell dazu, dass sensible Spalten mitversendet werden oder unnötig viele Daten an den Client gehen. Eloquent-API-Ressourcen bilden eine Transformationsschicht zwischen Model und JSON-Antwort. In der Methode toArray() legen Sie explizit fest, welche Informationen in welcher Form in die Antwort einfließen. Die Vorteile im Überblick:
  • Volle Kontrolle darüber, welche Felder in der Antwort erscheinen
  • Feldumbenennung und Werttransformation an einem Ort gebündelt
  • Felder lassen sich bedingt ein- oder ausblenden
  • Relationen können verschachtelt werden, um eine konsistente Struktur zu wahren

Ressource erstellen

Erzeugen Sie eine Resource-Klasse mit dem Artisan-Befehl make:resource.
Die generierte Klasse liegt im Verzeichnis app/Http/Resources.
Mit $this greifen Sie direkt auf die Modelleigenschaften zu. Das ist möglich, weil die Resource-Klasse Zugriffe intern an das Model weiterleitet.

Verwendung im Controller

Definierte Resources können aus einem Controller oder einer Route zurückgegeben werden.
Alternativ verwenden Sie die Methode toResource() des Modells.
toResource() sucht anhand des Modellnamens automatisch die passende Resource-Klasse (UserResource). Standardmäßig wird die Antwort in einen Schlüssel data verpackt.

Resource-Collections

Für mehrere Modelle nutzen Sie die Methode collection().
Alternativ verwenden Sie toResourceCollection() auf einer Eloquent-Collection.

Eigene Collection-Resource

Um Metadaten auf Ebene der gesamten Collection hinzuzufügen, legen Sie eine eigene Collection-Resource an.

Felder transformieren und anpassen

Innerhalb von toArray() können Sie Feldnamen ändern und Werte transformieren.

Bedingte Felder

when() – Feld unter Bedingung hinzufügen

Um ein Feld nur unter bestimmten Voraussetzungen einzublenden, nutzen Sie when().
Ist die Bedingung von when() false, wird der Schlüssel komplett aus der Antwort entfernt.

mergeWhen() – mehrere Felder gemeinsam bedingen

Sollen mehrere Felder gemeinsam ein- oder ausgeblendet werden, verwenden Sie mergeWhen().

whenLoaded() – nur geladene Relationen einbinden

Indem Sie Relationen nur bei bereits geladenem Eager Loading einbinden, vermeiden Sie das N+1-Problem und behalten die Struktur flexibel.
Ob die Relation geladen wird, steuert der Controller.

whenCounted() – Zähler bedingt einbinden

Anzahlen, die per loadCount() geladen wurden, lassen sich mit whenCounted() bedingt ausgeben.

Verschachtelte Ressourcen

Verschachteln Sie Relationen über eigene Resource-Klassen, um eine konsistente Struktur zu erzielen.

Metadaten hinzufügen

with() – Metadaten auf oberster Ebene

Um Metadaten für die gesamte Collection anzuhängen, überschreiben Sie die Methode with().
Beispielhafte Antwort:

additional() – Metadaten dynamisch ergänzen

Möchten Sie Metadaten dynamisch aus dem Controller heraus hinzufügen, verwenden Sie additional().

Zusammenspiel mit Paginierung

Wenn Sie ein Paginierungs-Ergebnis an eine Resource übergeben, werden meta und links automatisch ergänzt.
Oder:
Beispielhafte Antwort:
Bei Paginierungs-Antworten wird der Schlüssel data immer beibehalten – auch wenn Sie withoutWrapping() aufgerufen haben. Nur so lassen sich die Schlüssel meta und links sauber daneben ausliefern.

Daten-Wrapping deaktivieren

Standardmäßig wird die äußerste Resource in einen Schlüssel data verpackt. Deaktivieren Sie dieses Verhalten mit withoutWrapping() in der boot()-Methode Ihres AppServiceProvider.
withoutWrapping() wirkt sich nur auf das äußerste Wrapping aus. Ein von Ihnen selbst definierter data-Schlüssel bleibt erhalten.

Praxisbeispiel: eine Nutzer-API implementieren

Am Beispiel einer Nutzerverwaltungs-API zeigen wir, wie sich konsistente Antworten mit Ressourcen umsetzen lassen.

UserResource

UserController

Verwandte Seiten

Einführung in Eloquent-Relationen

Auffrischung zur Definition von Relationen und zu Eager Loading.

Paginierung

Erfahren Sie, wie Sie Paginierungs-Ergebnisse mit API-Ressourcen kombinieren.
Zuletzt geändert am 13. Juli 2026