Skip to main content

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 metodo toArray() 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 Artisan make:resource generi una classe resource.
La classe generata si trova nella directory app/Http/Resources.
Con $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.
In alternativa, usa il metodo 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 metodo collection().
Oppure toResourceCollection() su una collection Eloquent.

Resource collection personalizzata

Per aggiungere metadati all’intera collection crea una resource collection dedicata.

Trasformazione dei campi

In toArray() 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 usa when().
Se la condizione di when() è false, la chiave stessa viene rimossa dalla risposta.

mergeWhen() — aggiungere più campi condizionalmente

Per gestire più campi con la stessa condizione usa mergeWhen().

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.
Nel controller decidi se caricare la relazione.

whenCounted() — includere il conteggio condizionalmente

Include il conteggio di una relazione ottenuto con loadCount().

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 metodo with().
Esempio di risposta:

additional() — aggiungere metadati dinamicamente

Se vuoi aggiungere metadati dinamicamente dal controller usa additional().

Combinazione con la paginazione

Passando un risultato paginato alla resource, meta e links vengono aggiunti automaticamente.
Oppure:
Esempio di risposta:
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 chiave data. Per disabilitarlo chiama withoutWrapping() in boot() di AppServiceProvider.
withoutWrapping() agisce solo sul wrapping più esterno. Le chiavi data che definisci tu non vengono rimosse.

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.
Ultima modifica il 13 luglio 2026