Skip to content

API Resources

Documentazione Laravel

Alcune volte è necessario aggiungere qualcosa ai singoli oggetti che compongono la collection di risposta. Infatti dopo la sua generazione, ci sarà una nuova API Resource dedicata (già presente e utilizzata nel Controller apposito).

Una classe API Resource appena generata si presenta così:

php
class UserResource extends JsonResource
{
    public function toArray($request)
    {
        $resourceArray = parent::toArray($request);

        //

        return $resourceArray;
    }
}

La classe estesa JsonResource, nel caso in cui vengano legate altre risorse, si occuperà durante il recupero di passare anche per le loro definite API Resources.

Il metodo parent::toArray($request) permette di accedere all'array che corrisponde a uno degli N, e dovrà essere quello poi ritornato nel metodo con tutte le modifiche desiderate. In aggiunta, si può anche passare un array (additional).

Esempio di utilizzo

Controller

php
class UserController extends Controller
{
    public function index(UserIndexRequest $request): ResourceCollection
    {
        $validated = $request->validated();

        $users = User::with($validated['with'] ?? [])->orderBy("users.last_name");

        if ($validated['paginate'] ?? false) {
            $users = $users->paginate($validated['limit'] ?? null);
        } else {
            $users = $users->get();
        }

        /** Utilizzo l'additional della risorsa */
        return FoodDishResource::collection($users, ["format_phone_number" => true]);
    }
}

API Resource

php
/** @property $resource User */
class UserResource extends JsonResource
{
    public function toArray($request)
    {
        $resourceArray = parent::toArray($request);
        $user = $this->resource;

        if(isset($this->additional['format_phone_number'])){
            $resourceArray['formatted_phone_number'] = "+{$user->phone_prefix} {$user->phone_number}";
        }

        return $resourceArray;
    }
}