Spec Backend Com Php E Laravel • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 04.1 — Middleware de Rota com $next($request)

Contexto: Middleware de Rota com $next($request) no contexto de Middlewares e Tratamento de Exceções.

Requisitos de Execução:

  1. Criar middleware CheckApiVersion que insira o cabeçalho X-Api-Version: 1.0 na resposta.

Resultado Esperado

Header 'X-Api-Version: 1.0' injetado na resposta HTTP.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_04_1_SeuNome
  2. Envie na tarefa: Atividade Cap 04 - Middlewares e Tratamento de Exceções
🔑 Gabarito de Código & Solução Comentada
<?php
// app/Http/Middleware/CheckApiVersion.php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class CheckApiVersion
{
    public function handle(Request $request, Closure $next): Response
    {
        $response = $next($request);
        $response->headers->set('X-Api-Version', '1.0');
        return $response;
    }
}

🔍 Nível 2: Prática

Problema 04.2 — Registro de Middlewares Globais no bootstrap/app.php do Laravel 11

Contexto: Registro de Middlewares Globais no bootstrap/app.php do Laravel 11 no contexto de Middlewares e Tratamento de Exceções.

Requisitos de Execução:

  1. Configurar middlewares na nova estrutura unificada do Laravel 11.

Resultado Esperado

Middlewares registrados via closure no arquivo bootstrap/app.php.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_04_2_SeuNome
  2. Envie na tarefa: Atividade Cap 04 - Middlewares e Tratamento de Exceções
🔑 Gabarito de Código & Solução Comentada
<?php
// bootstrap/app.php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->append(\App\Http\Middleware\CheckApiVersion::class);
    })->create();

⚡ Nível 3: Integração

Problema 04.3 — Renderização Customizada de Exceções com withExceptions

Contexto: Renderização Customizada de Exceções com withExceptions no contexto de Middlewares e Tratamento de Exceções.

Requisitos de Execução:

  1. Tratar exceções ModelNotFoundException formatando JSON amigável com status 404.

Resultado Esperado

Exceção capturada globalmente: {'erro': 'Recurso não encontrado'}.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_04_3_SeuNome
  2. Envie na tarefa: Atividade Cap 04 - Middlewares e Tratamento de Exceções
🔑 Gabarito de Código & Solução Comentada
<?php
// bootstrap/app.php (Exceptions)
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Database\Eloquent\ModelNotFoundException;

->withExceptions(function (Exceptions $exceptions) {
    $exceptions->render(function (ModelNotFoundException $e) {
        return response()->json(['erro' => 'Recurso não encontrado'], 404);
    });
})

🏆 Nível 4: Desafio Corporativo

Problema 04.4 — Middleware de Manutenção com Bypass por IP e Token Secreto

Contexto: Middleware de Manutenção com Bypass por IP e Token Secreto no contexto de Middlewares e Tratamento de Exceções.

Requisitos de Execução:

  1. Criar middleware de manutenção que permita acesso apenas a IPs da equipe de DevOps.

Resultado Esperado

Bypass de manutenção concedido para IP 192.168.1.100.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_04_4_SeuNome
  2. Envie na tarefa: Atividade Cap 04 - Middlewares e Tratamento de Exceções
🔑 Gabarito de Código & Solução Comentada
<?php
// app/Http/Middleware/MaintenanceBypass.php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class MaintenanceBypass
{
    private array $allowedIps = ['192.168.1.100', '127.0.0.1'];

    public function handle(Request $request, Closure $next)
    {
        if (app()->isDownForMaintenance() && !in_array($request->ip(), $this->allowedIps)) {
            return response()->json(['erro' => 'Sistema em manutenção'], 503);
        }
        return $next($request);
    }
}