🧩 Exercícios: Eloquent API Resources e Serialização REST
Spec Backend Com Php E Laravel • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 11.1 — Criação de JsonResource para Formatação de Resposta
Contexto: Criação de JsonResource para Formatação de Resposta no contexto de Eloquent API Resources e Serialização REST.
Requisitos de Execução:
- Criar
ProdutoResource extends JsonResourceselecionando e formatando campos para a API.
Resultado Esperado
Entidade Eloquent transformada em JSON formatado com campos calculados.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_11_1_SeuNome - Envie na tarefa:
Atividade Cap 11 - Eloquent API Resources e Serialização REST
🔑 Gabarito de Código & Solução Comentada
<?php
// app/Http/Resources/ProdutoResource.php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ProdutoResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'nome' => $this->nome,
'preco_formatado' => 'R$ ' . number_format($this->preco, 2, ',', '.'),
'criado_em' => $this->created_at->toISOString(),
];
}
}
🔍 Nível 2: Prática
Problema 11.2 — Coleções com ResourceCollection e Metadados Adicionais
Contexto: Coleções com ResourceCollection e Metadados Adicionais no contexto de Eloquent API Resources e Serialização REST.
Requisitos de Execução:
- Retornar
ProdutoResource::collection($produtos)com dados adicionais no métodowith().
Resultado Esperado
Array de produtos retornado com bloco de metadados corporativos.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_11_2_SeuNome - Envie na tarefa:
Atividade Cap 11 - Eloquent API Resources e Serialização REST
🔑 Gabarito de Código & Solução Comentada
<?php
// app/Http/Resources/ProdutoCollection.php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\ResourceCollection;
class ProdutoCollection extends ResourceCollection
{
public function toArray(Request $request): array
{
return ['data' => $this->collection];
}
public function with(Request $request): array
{
return ['meta' => ['empresa' => 'TechCorp', 'versao' => 'v1.0']];
}
}
⚡ Nível 3: Integração
Problema 11.3 — Inclusão Condicional de Relacionamentos com whenLoaded()
Contexto: Inclusão Condicional de Relacionamentos com whenLoaded() no contexto de Eloquent API Resources e Serialização REST.
Requisitos de Execução:
- Incluir relacionamento de pedidos no JSON apenas quando tiver sido carregado com eager loading via
$this->whenLoaded('pedidos').
Resultado Esperado
Relacionamento embutido apenas quando carregado, prevenindo queries N+1 acidentais.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_11_3_SeuNome - Envie na tarefa:
Atividade Cap 11 - Eloquent API Resources e Serialização REST
🔑 Gabarito de Código & Solução Comentada
<?php
// app/Http/Resources/ClienteResource.php
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'nome' => $this->nome,
'pedidos' => PedidoResource::collection($this->whenLoaded('pedidos')),
];
}
🏆 Nível 4: Desafio Corporativo
Problema 11.4 — Campos Condicionais por Permissão com when()
Contexto: Campos Condicionais por Permissão com when() no contexto de Eloquent API Resources e Serialização REST.
Requisitos de Execução:
- Ocultar dados confidenciais (margem de lucro) a menos que o usuário logado seja ADMIN via
$this->when($request->user()->isAdmin(), ...).
Resultado Esperado
Dado sensível serializado apenas para usuários com perfil de administrador.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_11_4_SeuNome - Envie na tarefa:
Atividade Cap 11 - Eloquent API Resources e Serialização REST
🔑 Gabarito de Código & Solução Comentada
// Implementação de referência para o requisito do nível
<?php
// app/Http/Resources/ProdutoResource.php
'margem_lucro' => $this->when($request->user()?->is_admin, $this->margem_lucro),
// Conclusão da operação e validação de conformidade
$executado = true;
\Log::info('Operação corporativa executada com sucesso.');
if (!$executado) throw new \RuntimeException('Falha na operação');
return response()->json(['sucesso' => true]);