Wat zijn API-resources?
Wanneer je een API bouwt en Eloquent-modellen rechtstreeks als JSON teruggeeft, kunnen kolommen die je wilt verbergen uitlekken of stuur je grote hoeveelheden data die de client niet nodig heeft. Eloquent API-resources vormen een transformatielaag tussen je modellen en de JSON-response. In detoArray()-methode definieer je expliciet “wat er in welk formaat in de response komt”.
De belangrijkste voordelen zijn:
- Volledige controle over welke velden in de response komen
- Naamsconversies en waardebewerkingen van velden op één plek gebundeld
- Velden voorwaardelijk tonen of verbergen
- Relaties nesten met behoud van een consistente structuur
Resources maken
Genereer een resourceklasse met het Artisan-commandomake:resource.
app/Http/Resources.
$this heb je rechtstreeks toegang tot de properties van het model. Dat komt doordat de resourceklasse intern de toegang tot het model proxyt.
Gebruik in een controller
Je kunt de gedefinieerde resource teruggeven vanuit een controller of route.toResource()-methode van het model.
toResource() zoekt automatisch de bijbehorende resourceklasse (UserResource) op basis van de modelnaam.
Standaard wordt de response gewrapt in een data-sleutel.
Resource-collecties
Wil je meerdere modellen teruggeven, gebruik dan decollection()-methode.
toResourceCollection() van een Eloquent-collectie.
Eigen collectieresources
Wil je metadata toevoegen aan de hele collectie, maak dan een speciale collectieresource.Velden bewerken en transformeren
BinnentoArray() kun je veldnamen wijzigen en waarden bewerken.
Voorwaardelijke velden
when() — velden toevoegen afhankelijk van een voorwaarde
Wil je een veld alleen opnemen als aan een bepaalde voorwaarde wordt voldaan, gebruik danwhen().
when() false is, wordt de sleutel zelf uit de response verwijderd.
mergeWhen() — meerdere velden gebundeld voorwaardelijk toevoegen
Om meerdere velden onder dezelfde voorwaarde samen te tonen of te verbergen, gebruik jemergeWhen().
whenLoaded() — alleen geladen relaties opnemen
Door een relatie alleen op te nemen wanneer die eager geladen is, kun je flexibele responses maken en tegelijk het N+1-probleem voorkomen.whenCounted() — tellingen voorwaardelijk opnemen
Neemt de metloadCount() opgehaalde telling van een relatie voorwaardelijk op.
Geneste resources
Door relaties te nesten met een andere resourceklasse behoud je een consistente structuur.Metadata toevoegen
with() — metadata op het topniveau
Om metadata toe te voegen aan de hele collectie, override je dewith()-methode.
additional() — dynamisch metadata toevoegen
Wil je aan de controllerkant dynamisch metadata toevoegen, gebruik danadditional().
Combineren met paginering
Door een pagineringsresultaat aan een resource door te geven, wordenmeta en links automatisch toegevoegd.
Bij pagineringsresponses wordt de
data-sleutel altijd toegevoegd, ook als je withoutWrapping() hebt aangeroepen. Dit is om samen te kunnen bestaan met de meta- en links-sleutels van de paginering.Datawrapping uitschakelen
Standaard wordt de buitenste resource gewrapt in eendata-sleutel. Om dit uit te schakelen, roep je withoutWrapping() aan in de boot() van je AppServiceProvider.
Praktijkvoorbeeld: implementatie van een gebruikers-API
Aan de hand van een gebruikersbeheer-API laten we een consistent responseontwerp met resources zien.UserResource
UserController
Gerelateerde pagina’s
Introductie tot Eloquent-relaties
Bekijk hoe je relaties definieert en eager loading gebruikt.
Paginering
Bekijk hoe je pagineringsresultaten combineert met API-resources.