Cosa sono le API Resource
Quando costruisci un’API, restituire direttamente i modelli Eloquent come JSON può esporre colonne che vorresti nascondere o inviare al client molti dati che non gli servono. Le Eloquent API Resource sono un livello di trasformazione tra il modello e la risposta JSON. Con il metodotoArray() definisci esplicitamente “cosa e in che formato” includere nella risposta.
Vantaggi principali:
- Controllo totale sui campi inclusi nella risposta
- Un unico posto per rinominare campi e trasformare valori
- Puoi mostrare o nascondere campi in base a condizioni
- Puoi annidare le relazioni mantenendo una struttura coerente
Creazione di una resource
Con il comando Artisanmake:resource generi una classe resource.
app/Http/Resources.
$this accedi direttamente alle proprietà del modello. La classe resource fa da proxy verso il modello.
Uso nel controller
Puoi restituire la resource da controller o route.toResource() del modello.
toResource() cerca automaticamente la classe resource corrispondente (UserResource) in base al nome del modello.
Di default la risposta è wrappata nella chiave data.
Resource collection
Per restituire più modelli usa il metodocollection().
toResourceCollection() su una collection Eloquent.
Resource collection personalizzata
Per aggiungere metadati all’intera collection crea una resource collection dedicata.Trasformazione dei campi
IntoArray() puoi rinominare i campi e trasformare i valori.
Campi condizionali
when() — aggiungere campi in base a una condizione
Per includere un campo solo se una condizione è soddisfatta usawhen().
when() è false, la chiave stessa viene rimossa dalla risposta.
mergeWhen() — aggiungere più campi condizionalmente
Per gestire più campi con la stessa condizione usamergeWhen().
whenLoaded() — includere solo relazioni già caricate
Includendo la relazione solo se è già stata caricata con eager loading eviti il problema N+1 e crei risposte flessibili.whenCounted() — includere il conteggio condizionalmente
Include il conteggio di una relazione ottenuto conloadCount().
Resource annidate
Annidando una relazione con un’altra classe resource mantieni una struttura coerente.Aggiungere metadati
with() — metadati top-level
Per aggiungere metadati all’intera collection sovrascrivi il metodowith().
additional() — aggiungere metadati dinamicamente
Se vuoi aggiungere metadati dinamicamente dal controller usaadditional().
Combinazione con la paginazione
Passando un risultato paginato alla resource,meta e links vengono aggiunti automaticamente.
Nelle risposte paginate, anche se hai chiamato
withoutWrapping(), la chiave data viene sempre inclusa per coesistere con le chiavi meta e links della paginazione.Disabilitare il wrapping
Di default la resource più esterna viene wrappata nella chiavedata. Per disabilitarlo chiama withoutWrapping() in boot() di AppServiceProvider.
Esempio pratico: implementazione di un’API utenti
Progettazione di risposte coerenti tramite resource per un’API di gestione utenti.UserResource
UserController
Pagine correlate
Introduzione alle relazioni Eloquent
Rivedi come definire le relazioni e l’eager loading.
Paginazione
Impara come combinare risultati paginati con le API resource.