📚 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.
O diagrama abaixo ilustra o ciclo de eventos reativos entre o navegador, o motor Livewire e o Eloquent ORM:
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
| 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 |
| 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. |
| 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. |
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
| 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 ✅ |
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,
]);
}
}
cd catalogo_projetos/backend_php_02_livewire_spa/api-laravel
composer install
php artisan migrate --seed
php artisan serve --port=8000
Abra http://localhost:8000 e experimente digitar no campo de busca para comprovar a reatividade em tempo real sem reload de página.
| 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 ✅ |