Dev Log: Costuras de Driver, Bugs de URL e Configurações de DB
Passei o dia construindo uma plataforma. Uma ideia arquitetural surgiu constantemente. Você deve criar uma costura entre o que você faz e onde você armazena os dados.
Isso permite que você troque seu backend mais tarde sem alterar seu código principal.
O Padrão de Costuras
Estou construindo uma plataforma de observabilidade. Ela coleta erros e métricas de diversas fontes. Cada tarefa de armazenamento seguiu o mesmo padrão:
• Criar uma pequena interface (o contrato). • Criar um driver Eloquent (a implementação).
Dashboards e pipelines conversam apenas com a interface. Uso Postgres por enquanto porque é confiável. Se eu precisar de um banco de dados mais rápido mais tarde, basta escrever um novo driver. Não altero o código do meu dashboard.
A lição é simples: você não precisa de um segundo driver no primeiro dia. Você precisa da interface no primeiro dia. Um arquivo extra agora evita uma reescrita massiva no futuro.
Três Bons Hábitos
• Use identificadores duplos. Use IDs de auto-incremento para joins internos rápidos. Use UUIDs para qualquer coisa que saia do seu sistema, como URLs ou APIs. Isso mantém a contagem de suas linhas privada.
• Use Enums. Armazene roles e status em enums do PHP. Isso garante que sua UI e sua lógica usem a mesma fonte da verdade.
• Versione seus dados. Sempre inclua um campo de versão em seus payloads. Adicione novos campos opcionais, mas nunca renomeie ou remova os antigos. Isso evita quebrar clientes mais antigos.
O Bug da URL de Rastreamento
Encontrei um bug em um pacote de rastreamento de e-mail. O pacote reescreve links para rastrear cliques. Ele criptografa a URL e depois a restaura durante o redirecionamento.
O problema: o Laravel faz o escape de HTML nos links em templates de e-mail. Uma URL assinada usa caracteres "&". No HTML, eles se tornam "&".
Se você criptografar a string com escape, o "&" permanecerá na URL. Quando o Laravel tenta validar a assinatura, ele falha porque a string mudou. Isso só acontece com URLs assinadas, por isso é difícil de encontrar.
A correção: Decodifique as entidades HTML antes de capturar a URL.
Usando o Banco de Dados para Configurações
Construí uma maneira para que administradores alterem as configurações do app em um dashboard. Essas configurações residem no banco de dados, mas o app ainda as lê usando a função padrão config().
Uso uma camada fina no AppServiceProvider. Ela lê as configurações do banco de dados e as envia para o config para a requisição atual. Isso mantém o restante do código simples e padronizado.
O tema comum aqui são os limites. Decida onde a costura deve ficar. Coloque o limite no lugar certo uma única vez. Todo o resto permanece simples.
