GUIA · LARAVEL
Laravel em produção: o guia
Notas de quem usa Laravel todo dia em sistemas que movimentam dinheiro: filas e Horizon, testes de integrações externas, performance de banco e organização de código que o próximo dev entende.
- Como evitar saldo negativo com débitos simultâneos no Laravel e PostgreSQL Checar o saldo no PHP e depois salvar abre espaço para saldo negativo. Veja como usar UPDATE condicional, lockForUpdate, ordem de locks e CHECK no PostgreSQL.
- Como receber webhooks de gateway de pagamento no Laravel sem perder nem duplicar eventos Validar a assinatura no corpo cru, gravar o evento antes de processar, deduplicar com índice único e tratar eventos fora de ordem: o pipeline de webhook que uso no Laravel.
- Dinheiro no Laravel: centavos em inteiro, cast de Money e split sem perder centavo Como guardar valores em centavos no PostgreSQL, encapsular em um value object Money com cast do Eloquent e dividir split e parcelas sem criar nem sumir com centavos.
- Migrations sem downtime no Laravel com PostgreSQL: índices, NOT NULL e backfill em tabela grande Como rodar migrations no Laravel sem travar tabelas grandes no PostgreSQL: lock_timeout, CREATE INDEX CONCURRENTLY, constraints NOT VALID, backfill em lotes e expand/contract.
- Rate limit de APIs de pagamento nos jobs do Laravel: RateLimited, Redis::throttle e Retry-After Como impedir que jobs de conciliação e reprocessamento estourem o limite de requisições do gateway, sem mandar tudo para failed_jobs nem travar a fila de webhooks.
- Como criptografar CPF no Laravel sem perder a busca: encrypted cast e blind index Cast encrypted protege o CPF no banco, mas impede WHERE e índice único. Veja como resolver com blind index via HMAC, chave separada e rotação sem downtime.
- Como evitar race condition no saldo da conta digital com Laravel e PostgreSQL Debitar saldo com ler-calcular-salvar quebra sob concorrência. Quando usar lockForUpdate, update atômico condicional, Cache::lock e constraint no banco.
- Jobs disparados dentro de transação: o bug silencioso do afterCommit no Laravel Disparar um job dentro de DB::transaction parece inofensivo até o worker ler um registro que ainda não existe. Como trato isso em fluxos financeiros e onde o afterCommit não basta.