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)
    {
        return parent::toArray($request);
    }
}

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
class UserResource extends JsonResource
{
    public function toArray($request)
    {
        if(!isset($this->additional["format_phone_number"]))
            return parent::toArray($request);

        $resourceArray = parent::toArray($request);

        /** @var $user User */
        $user = $this->resource;

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

        return $resourceArray;
    }
}