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:

  1. Criar ProdutoResource extends JsonResource selecionando e formatando campos para a API.

Resultado Esperado

Entidade Eloquent transformada em JSON formatado com campos calculados.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_11_1_SeuNome
  2. 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:

  1. Retornar ProdutoResource::collection($produtos) com dados adicionais no método with().

Resultado Esperado

Array de produtos retornado com bloco de metadados corporativos.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_11_2_SeuNome
  2. 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:

  1. 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)

  1. Salve o arquivo como: Atividade_11_3_SeuNome
  2. 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:

  1. 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)

  1. Salve o arquivo como: Atividade_11_4_SeuNome
  2. 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]);