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


🎯 Nível 1: Fundamentos

Problema 08.1 — Model Factory com Dados Fictícios do Faker

Contexto: Model Factory com Dados Fictícios do Faker no contexto de Seeders, Factories e Transações de Banco.

Requisitos de Execução:

  1. Criar ProdutoFactory gerando dados realistas com $this->faker->words(), randomFloat() e boolean().

Resultado Esperado

Factory configurada com estados padrão para geração de massa de testes.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_08_1_SeuNome
  2. Envie na tarefa: Atividade Cap 08 - Seeders, Factories e Transações de Banco
🔑 Gabarito de Código & Solução Comentada
<?php
// database/factories/ProdutoFactory.php
namespace Database\Factories;

use App\Models\Produto;
use Illuminate\Database\Eloquent\Factories\Factory;

class ProdutoFactory extends Factory
{
    protected $model = Produto::class;

    public function definition(): array
    {
        return [
            'nome' => $this->faker->words(3, true),
            'sku' => $this->faker->unique()->bothify('PROD-####-??'),
            'preco' => $this->faker->randomFloat(2, 10, 500),
            'ativo' => true,
        ];
    }
}

🔍 Nível 2: Prática

Problema 08.2 — Database Seeder Populando Dados em Cascata

Contexto: Database Seeder Populando Dados em Cascata no contexto de Seeders, Factories e Transações de Banco.

Requisitos de Execução:

  1. Implementar DatabaseSeeder gerando 10 clientes com 3 pedidos cada usando Cliente::factory()->has(Pedido::factory()->count(3))->create().

Resultado Esperado

Seeding executado: 10 clientes e 30 pedidos associados persistidos.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_08_2_SeuNome
  2. Envie na tarefa: Atividade Cap 08 - Seeders, Factories e Transações de Banco
🔑 Gabarito de Código & Solução Comentada
<?php
// database/seeders/DatabaseSeeder.php
namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\Cliente;
use App\Models\Pedido;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        Cliente::factory(10)
            ->has(Pedido::factory()->count(3))
            ->create();
    }
}

⚡ Nível 3: Integração

Problema 08.3 — Transações Atômicas com DB::transaction() e Retries

Contexto: Transações Atômicas com DB::transaction() e Retries no contexto de Seeders, Factories e Transações de Banco.

Requisitos de Execução:

  1. Executar criação de pedido e baixa de estoque encapsulados em DB::transaction(callback, 3).

Resultado Esperado

Transação atômica concluída com sucesso com política de 3 tentativas em caso de deadlock.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_08_3_SeuNome
  2. Envie na tarefa: Atividade Cap 08 - Seeders, Factories e Transações de Banco
🔑 Gabarito de Código & Solução Comentada
<?php
// transacao_pedido.php
use Illuminate\Support\Facades\DB;
use App\Models\Pedido;

function criarPedidoTransacional(array $dados, array $itens) {
    return DB::transaction(function () use ($dados, $itens) {
        $pedido = Pedido::create($dados);
        foreach ($itens as $item) {
            $pedido->itens()->create($item);
        }
        return $pedido;
    }, 3);
}

🏆 Nível 4: Desafio Corporativo

Problema 08.4 — Bloqueio Pessimista com lockForUpdate()

Contexto: Bloqueio Pessimista com lockForUpdate() no contexto de Seeders, Factories e Transações de Banco.

Requisitos de Execução:

  1. Aplicar Produto::where('id', $id)->lockForUpdate()->first() para evitar concorrência em estoque.

Resultado Esperado

Linha bloqueada no banco até a finalização da transação.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_08_4_SeuNome
  2. Envie na tarefa: Atividade Cap 08 - Seeders, Factories e Transações de Banco
🔑 Gabarito de Código & Solução Comentada
<?php
// pessimistic_lock.php
use App\Models\Produto;

$produto = Produto::where('id', 1)->lockForUpdate()->first();
$produto->decrement('estoque', 1);
$executado = true;
\Log::info('Operação corporativa executada com sucesso.');