Samuel Arendt

Atributos do Laravel 13.2 colocam o contrato do model no topo

O Laravel 13.2 passou a aceitar atributos PHP como #[Fillable], #[Guarded], #[Hidden] e #[Table] nos models do Eloquent. As propriedades tradicionais continuam válidas. A mudança oferece uma segunda sintaxe para declarar metadados que influenciam preenchimento em massa, serialização e nome da tabela.

À primeira vista, trocar $fillable por um atributo parece apenas preferência estética. Em um model extenso, porém, a posição da configuração muda a leitura. O contrato aparece junto ao nome da classe, antes de casts, relacionamentos, scopes e métodos de domínio. Um revisor consegue identificar regras sensíveis sem procurar propriedades no corpo inteiro.

O valor não está em converter todos os arquivos. Ele aparece quando a equipe escolhe uma convenção clara e usa a nova forma onde ela melhora inspeção e consistência.

Declaração no topo reduz trabalho de busca

Models do Eloquent acumulam responsabilidades com facilidade. Mesmo em projetos cuidadosos, um arquivo pode reunir configuração da tabela, campos preenchíveis, atributos ocultos, casts e relações. Cada elemento tem impacto diferente, mas a sintaxe por propriedades os coloca no mesmo nível visual de qualquer estado interno da classe.

Atributos PHP funcionam como metadados anexados à declaração. Ao abrir o arquivo, o leitor vê rapidamente que um model aponta para uma tabela fora da convenção, restringe preenchimento e esconde campos na serialização. Isso ajuda no code review porque as decisões com efeito amplo ficam concentradas.

O benefício é maior em regras de segurança. Uma alteração na lista de campos preenchíveis merece atenção diferente de um método auxiliar. Localizar a lista no topo não impede mass assignment incorreto, mas reduz a chance de uma mudança importante ficar perdida em um diff extenso.

Ferramentas também podem explorar a estrutura. Reflection consegue ler atributos de forma padronizada, e analisadores estáticos podem oferecer navegação ou diagnóstico sem interpretar propriedades convencionais específicas do framework. O ganho depende do ecossistema adotar esses usos; hoje, a vantagem imediata continua sendo legibilidade.

Duas sintaxes criam uma decisão de equipe

Compatibilidade evita uma migração obrigatória, mas permite que dois models vizinhos expressem a mesma regra de maneiras diferentes. Se cada pessoa escolher por gosto, o projeto troca um problema de busca por inconsistência.

Uma convenção simples pode definir que código novo usa atributos e código existente muda apenas quando já estiver sendo alterado. Outra equipe pode manter propriedades em models pequenos e usar atributos quando a classe acumula muita configuração. Ambas funcionam se a regra for previsível.

Evite converter uma base inteira apenas para modernizar aparência. O diff toca arquivos estáveis, aumenta risco de conflito e oferece pouco retorno funcional. Uma migração oportunista mantém a revisão ligada a mudanças reais. Ferramentas automáticas só valem quando há volume suficiente e uma verificação confiável do comportamento resultante.

Também convém não misturar atributo e propriedade para a mesma preocupação dentro de uma classe. Mesmo quando o framework define precedência, o leitor precisa descobrir qual valor vence. Uma única fonte por regra deixa o contrato inequívoco.

Metadados não substituem limites no fluxo

#[Fillable] continua sendo uma parte da defesa contra entrada indevida. Controllers e serviços devem usar dados validados, e operações sensíveis podem exigir atribuição explícita. Mover a lista para o topo melhora sua visibilidade, sem corrigir um fluxo que envia $request->all() para o model.

O mesmo cuidado vale para #[Hidden]. Ocultar um atributo da serialização padrão não é um mecanismo geral de autorização. Outra query, log ou transformação pode expor o valor. A política precisa existir na camada que decide quem recebe o dado.

#[Table] torna exceções de nomenclatura fáceis de encontrar. Ele não torna uma tabela fora do padrão uma escolha melhor. Antes de adicionar o atributo, ainda vale perguntar se a divergência vem de integração legada, limite do banco ou apenas inconsistência acumulada.

Como avaliar a adoção

Um piloto pode começar com três models: um simples, um carregado de configuração e um ligado a uma entrada sensível. A equipe compara tempo de leitura, clareza do diff e suporte das ferramentas do editor. Depois executa a suíte para confirmar serialização, preenchimento e resolução da tabela. A comparação deve incluir também o comportamento do cache de metadados e qualquer pacote que leia propriedades do model diretamente.

O Laravel 13 já vinha ampliando atributos em controllers, jobs, commands, listeners e mailables. A versão 13.2 estende a linguagem declarativa ao Eloquent e também adiciona enums em #[Queue] e #[Connection], lista de atrasos em #[Backoff] e ajustes nas factories.

A direção do framework é coerente: metadados de execução se aproximam da declaração que modificam. Uma base ganha quando essa proximidade reduz procura e ambiguidade. Se a conversão apenas troca caracteres sem uma convenção compartilhada, a sintaxe nova vira mais uma escolha para discutir em cada pull request, sem melhorar a manutenção cotidiana do projeto.

Referências

#Arquitetura, #Gestão de Engenharia, #Qualidade de Software