📚 Pré-requisitos Teóricos: Este projeto prático aplica os conceitos avançados de interfaces reativas lecionados na Especialização em Backend com PHP e Laravel. Recomendamos sua consulta para contextualização sobre o ciclo de vida do Livewire 3 e Alpine.js.

A Aplicação SPA Reativa com Laravel 11 & Livewire 3 demonstra como construir interfaces modernas de alta interatividade sem a complexidade de gerenciar múltiplos ecossistemas desacoplados (como SPAs pesadas em React ou Vue). Através da computação reativa no servidor aliada ao algoritmo de DOM Morphing e Alpine.js, o Livewire entrega uma experiência de usuário instantânea com a segurança e produtividade do ecossistema Laravel.


🏛️ Arquitetura Reativa Server-Driven

O diagrama abaixo ilustra o ciclo de eventos reativos entre o navegador, o motor Livewire e o Eloquent ORM:

Arquitetura do Laravel Livewire 3

📁 Estrutura de Pastas Padronizada

A base de código segue o padrão canônico com nomenclatura anti-colisão:

catalogo_projetos/backend_php_02_livewire_spa/
├── api-laravel/              # Aplicação fullstack Laravel 11 com Livewire 3
│   ├── app/
│   │   ├── Livewire/
│   │   │   └── CatalogoProdutos.php   # Componente reativo server-side
│   │   └── Models/
│   │       └── Produto.php            # Modelo Eloquent
│   ├── resources/
│   │   └── views/
│   │       └── livewire/
│   │           └── catalogo-produtos.blade.php  # Template Blade com Livewire directives
│   └── composer.json                  # Dependências: laravel/framework, livewire/livewire
├── assets/                   # Galeria de diagramas visuais e arquitetura
│   └── arquitetura_laravel_livewire.svg
└── index.md                  # Especificação executiva e Padrão Ouro

🧑‍💼 Engenharia de Software & Requisitos

1. Histórias de Usuário (US)

ID Persona História de Usuário Prioridade
US-01 Consumidor Online Desejo digitar no campo de busca e ver a grade de produtos se atualizar em tempo real sem recarregar a página. Alta
US-02 Consumidor Online Desejo alternar entre páginas de produtos mantendo a posição e os filtros previamente selecionados. Alta
US-03 Usuário Mobile Desejo receber um indicador visual de carregamento (wire:loading) durante a sincronização de dados lentos. Média
US-04 Desenvolvedor Fullstack Desejo gerenciar regras de negócios e estados de tela inteiramente em PHP, sem escrever código de estado em JavaScript. Alta
US-05 Administrador Desejo validação instantânea de entradas de formulário com retorno amigável antes da persistência. Média

2. Requisitos Funcionais (RF)

ID Nome Descrição
RF-01 Binding Reativo (wire:model.live) Sincronizar campo de pesquisa em tempo real com debounce configurável (ex.: 300ms).
RF-02 Paginação Dinâmica Utilizar a trait WithPagination para navegação fluida preservando query string na URL.
RF-03 Filtragem Parametrizada Filtrar registros Eloquent por termo de busca, categoria e faixa de preço na mesma consulta.
RF-04 Indicadores de Loading Exibir loaders ou esqueletos visuais (wire:loading.delay) durante requisições de rede assíncronas.
RF-05 DOM Morphing Cirúrgico Aplicar patches no DOM do navegador alterando unicamente os nós HTML modificados.

3. Requisitos Não-Funcionais (RNF)

ID Nome Descrição
RNF-01 Latência de Resposta Ciclo completo de requisição/patch DOM inferior a 120ms sob condições normais de rede.
RNF-02 Segurança de Estado Criptografia e assinatura HMAC de todo o snapshot de estado enviado entre cliente e servidor.
RNF-03 Prevenção N+1 Queries Utilizar carregamento adiantado (eager loading) nas relações do Eloquent nos componentes.
RNF-04 Acessibilidade WCAG AA Foco preservado após mutações do DOM e elementos interativos navegáveis por teclado.
RNF-05 Código Limpo em PHP 8.3 Utilização de novos recursos do PHP 8.3 e boas práticas recomendadas do Livewire 3.

4. Diagrama de Casos de Uso

flowchart TD
    subgraph Atores
        CLI["Usuário / Comprador"]
        SIS["Motor Livewire 3"]
    end

    subgraph "Aplicação Reativa (api-laravel)"
        UC1["Digitar Termo de Busca (wire:model.live)"]
        UC2["Filtrar por Categoria e Preço"]
        UC3["Navegar pelas Páginas de Produtos"]
        UC4["Visualizar Feedback de Carregamento"]
        UC5["Renderizar Patch Cirúrgico no DOM"]
    end

    CLI --> UC1
    CLI --> UC2
    CLI --> UC3
    UC1 --> SIS
    UC2 --> SIS
    UC3 --> SIS
    SIS --> UC4
    SIS --> UC5

5. Matriz de Rastreabilidade (RTM)

Requisito Funcional Histórias Atendidas Requisitos Não-Funcionais Status de Cobertura
RF-01 (Binding Reativo) US-01, US-04 RNF-01, RNF-02 Implementado ✅
RF-02 (Paginação Dinâmica) US-02 RNF-01, RNF-04 Implementado ✅
RF-03 (Filtragem Parametrizada) US-01, US-02 RNF-03, RNF-05 Implementado ✅
RF-04 (Indicadores de Loading) US-03 RNF-01, RNF-04 Implementado ✅
RF-05 (DOM Morphing Cirúrgico) US-01, US-04 RNF-01, RNF-02 Implementado ✅

🛠️ Implementação do Componente (api-laravel/app/Livewire/CatalogoProdutos.php)

<?php

namespace App\Livewire;

use App\Models\Produto;
use Livewire\Component;
use Livewire\WithPagination;

class CatalogoProdutos extends Component
{
    use WithPagination;

    public string $busca = '';
    public string $categoria = '';
    public float $precoMax = 5000.0;

    protected $queryString = [
        'busca' => ['except' => ''],
        'categoria' => ['except' => ''],
    ];

    public function updatingBusca(): void
    {
        $this->resetPage();
    }

    public function render()
    {
        $produtos = Produto::query()
            ->when($this->busca, fn($q) => $q->where('nome', 'like', "%{$this->busca}%"))
            ->when($this->categoria, fn($q) => $q->where('categoria', $this->categoria))
            ->where('preco', '<=', $this->precoMax)
            ->orderBy('nome')
            ->paginate(12);

        return view('livewire.catalogo-produtos', [
            'produtos' => $produtos,
        ]);
    }
}

🚀 Roteiro de Execução

1. Iniciar Ambiente Laravel com Livewire 3

cd catalogo_projetos/backend_php_02_livewire_spa/api-laravel
composer install
php artisan migrate --seed
php artisan serve --port=8000

2. Acessar a Aplicação no Navegador

Abra http://localhost:8000 e experimente digitar no campo de busca para comprovar a reatividade em tempo real sem reload de página.


🎯 Matriz de Checkpoints de Entrega

Checkpoint Critério de Aceite Validação Status
CP-01 Inicialização do Livewire 3 integrado ao Laravel 11 Renderização inicial da Blade view PASS ✅
CP-02 Reatividade com wire:model.live atualizando a listagem Atualização do DOM sem recarregar a tela PASS ✅
CP-03 Paginação assíncrona com a trait WithPagination Troca de páginas mantendo estado de busca PASS ✅
CP-04 Indicador visual de loading com wire:loading Feedback ativo durante requisições PASS ✅
CP-05 Prevenção de sobrecarga de queries com eager loading Zero query duplicada N+1 no banco PASS ✅