API Resources
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;
}
}