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 MethodetoArray() 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-Befehlmake:resource.
app/Http/Resources.
$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.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 Methodecollection().
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 vontoArray() 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 Siewhen().
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 SiemergeWhen().
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.whenCounted() – Zähler bedingt einbinden
Anzahlen, die perloadCount() 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 Methodewith().
additional() – Metadaten dynamisch ergänzen
Möchten Sie Metadaten dynamisch aus dem Controller heraus hinzufügen, verwenden Sieadditional().
Zusammenspiel mit Paginierung
Wenn Sie ein Paginierungs-Ergebnis an eine Resource übergeben, werdenmeta und links automatisch ergänzt.
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üsseldata verpackt. Deaktivieren Sie dieses Verhalten mit withoutWrapping() in der boot()-Methode Ihres AppServiceProvider.
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.