O Laravel 13 agora permite que você substitua as propriedades $table, $fillable e $casts que sobrecarregam a maioria dos modelos por atributos nativos do PHP. A mudança se aplica a mais de uma dúzia de recursos do framework, desde a configuração de modelos até ouvintes de eventos (event listeners) e mailables, e funciona sem quebrar o código existente.
Por que o Laravel adicionou atributos nativos
O Laravel há muito tempo depende de “strings mágicas” – arrays de nomes de colunas ou campos ocultos que ficam no topo de uma classe de modelo. Esses arrays não dão pistas à IDE sobre o esquema subjacente, então a refatoração de um nome de coluna pode passar despercebida. Ao mover a configuração para um código real e tipado, o Laravel oferece aos desenvolvedores uma maneira de manter o corpo da classe focado na lógica de negócio, enquanto permite que o editor exiba preenchimento automático (autocomplete), verificação de tipos e ferramentas de renomeação e refatoração.
O framework lê os atributos via API de reflexão do PHP e faz o cache do resultado, de modo que o overhead de tempo de execução é efetivamente zero. Os modelos existentes baseados em propriedades continuam a funcionar exatamente como funcionam hoje, o que significa que você pode adotar a nova sintaxe gradualmente.
O que você ganha
- Configuração tipada – Atributos aceitam argumentos tipados, eliminando strings mágicas. Renomeie uma coluna e a IDE apontará todos os lugares que você precisa atualizar.
- Corpos de classe mais limpos – Toda a configuração reside acima do nome da classe; o corpo contém apenas relacionamentos, escopos e métodos.
- Melhor experiência de IDE – Autocomplete e análise estática funcionam nos argumentos dos atributos, algo que arrays de strings não podem fornecer.
- Sem alterações que quebrem o código – O Laravel lê tanto as propriedades antigas quanto os novos atributos, portanto, uma base de código mista funciona sem problemas.
Guia de migração passo a passo
Identifique o modelo para migrar
Abra o arquivo do modelo. Se as primeiras doze linhas forem dominadas por$table,$fillable,$hiddenou um métodocasts(), ele é um candidato.Adicione as classes de atributo
No topo do arquivo, importe as classes de atributo que correspondem às propriedades que você substituirá (ex:Table,Fillable,Casts). O Laravel já fornece esses atributos nativamente.Substitua as declarações de propriedade por atributos
// Before protected $table = 'site_deployments'; protected $fillable = ['site_id', 'server_id', 'status']; protected function casts(): array { return ['is_rollback' => 'boolean']; }// After #[Table('site_deployments')] #[Fillable(['site_id', 'server_id', 'status'])] #[Casts(['is_rollback' => 'boolean'])] class Deployment extends Model { // business logic only }A sintaxe de atributo fica diretamente acima da declaração da classe. Remova a propriedade ou método original após confirmar que o atributo funciona.
Execute a suíte de testes
Verifique se a atribuição em massa (mass-assignment), a serialização e qualquer casting personalizado ainda se comportam como antes. O tratamento de atributos do Laravel é em cache, então um teste que falha geralmente aponta para um erro de digitação nos argumentos do atributo.Faça o commit e o deploy em pequenos lotes
Envie o modelo migrado para um branch de funcionalidade (feature branch), faça o merge após a passagem do pipeline de CI e implemente em um subconjunto de servidores. Como a sintaxe de propriedade antiga ainda é suportada, qualquer referência perdida não causará um erro de tempo de execução.Repita por namespace
Em vez de reescrever toda a base de código de uma vez, mova um grupo lógico de modelos (ex: todas as entidades relacionadas ao faturamento) para atributos e, em seguida, repita para o próximo grupo. Isso limita o raio de impacto de qualquer regressão.
Ferramentas e redes de segurança
- Rector – Uma ferramenta de refatoração automatizada que pode converter a sintaxe repetitiva de propriedades em atributos. Execute-a em uma cópia da base de código, revise o diff e aplique as alterações que parecerem corretas.
- Testes automatizados – As utilidades de teste integradas do Laravel capturam discrepâncias na atribuição em massa e na saída JSON. Mantenha-os passando (green) após cada etapa de migração.
- Feature flags – Se precisar reverter rapidamente, envolva o uso do novo atributo em uma flag que alterna entre a configuração antiga e a nova.
Quando você pode pular a migração
Se um projeto for pequeno, estável e raramente tocado, o benefício de modelos mais limpos pode não compensar o esforço de conversão. A sintaxe de atributo é opcional; você pode continuar usando a abordagem clássica de propriedades indefinidamente. Por outro lado, para aplicações em desenvolvimento ativo, especialmente aquelas com modelos grandes ou mudanças frequentes de esquema, adotar atributos precocemente reduz o atrito futuro.
O que observar a seguir
O suporte a atributos do Laravel 13 se expande para além dos modelos, abrangendo ouvintes de eventos, notificações, mailables e eventos de broadcast. À medida que a comunidade adota a sintaxe nessas áreas, padrões de refatoração semelhantes surgirão. Fique de olho no guia de atualização oficial para quaisquer novas classes de atributos que cheguem em futuras versões menores.
Resumo: O Laravel 13 oferece um caminho de custo zero para modelos mais enxutos e amigáveis ao IDE. Converta um namespace por vez, apoie-se no Rector e na sua suíte de testes, e você acabará com classes que se leem como especificações de negócio, em vez de arquivos de despejo de configuração.
