Laravel 13 ahora te permite reemplazar las propiedades $table, $fillable y $casts que saturan la mayoría de los modelos mediante el uso de atributos nativos de PHP. El cambio se aplica a más de una docena de características del framework, desde la configuración de modelos hasta los escuchadores de eventos (event listeners) y los mailables, y funciona sin romper el código existente.
Por qué Laravel añadió atributos nativos
Laravel ha dependido durante mucho tiempo de las "cadenas mágicas" (magic strings): arrays de nombres de columnas o campos ocultos que se encuentran en la parte superior de una clase de modelo. Esos arrays no ofrecen pistas al IDE sobre el esquema subyacente, por lo que una refactorización del nombre de una columna puede pasar desapercibida. Al trasladar la configuración a código real y tipado, Laravel ofrece a los desarrolladores una forma de mantener el cuerpo de la clase enfocado en la lógica de negocio, permitiendo que el editor ofrezca autocompletado, comprobación de tipos y herramientas de renombrado y refactorización.
El framework lee los atributos a través de la API de reflexión de PHP y almacena el resultado en caché, por lo que la sobrecarga en tiempo de ejecución es prácticamente nula. Los modelos existentes basados en propiedades siguen funcionando exactamente como lo hacen hoy, lo que significa que puedes adoptar la nueva sintaxis de forma gradual.
Lo que ganas
- Configuración tipada – Los atributos aceptan argumentos tipados, eliminando las cadenas mágicas. Si renombras una columna, el IDE señalará cada lugar que necesitas actualizar.
- Cuerpos de clase más limpios – Toda la configuración reside por encima del nombre de la clase; el cuerpo contiene únicamente relaciones, scopes y métodos.
- Mejor experiencia con el IDE – El autocompletado y el análisis estático funcionan con los argumentos de los atributos, algo que los arrays de cadenas no pueden proporcionar.
- Sin cambios disruptivos – Laravel lee tanto las propiedades antiguas como los nuevos atributos, por lo que un código mixto funciona sin problemas.
Guía de migración paso a paso
Identifica el modelo a migrar
Abre el archivo del modelo. Si las primeras doce líneas están dominadas por$table,$fillable,$hiddeno un métodocasts(), es un candidato.Añade las clases de atributos
En la parte superior del archivo, importa las clases de atributos que correspondan a las propiedades que vas a reemplazar (por ejemplo,Table,Fillable,Casts). Laravel incluye estos atributos de serie.Reemplaza las declaraciones de propiedades con 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 }La sintaxis de atributo se sitúa directamente encima de la declaración de la clase. Elimina la propiedad o el método original tras confirmar que el atributo funciona.
Ejecuta la suite de pruebas
Verifica que la asignación masiva (mass-assignment), la serialización y cualquier casting personalizado sigan comportándose como antes. El manejo de atributos de Laravel se almacena en caché, por lo que un fallo en una prueba suele indicar un error tipográfico en los argumentos del atributo.Realiza el commit y despliega en lotes pequeños
Sube el modelo migrado a una rama de funcionalidad (feature branch), fusiónala después de que pase el pipeline de CI y despliégala en un subconjunto de servidores. Dado que la sintaxis de propiedad antigua sigue siendo compatible, cualquier referencia residual no causará un error en tiempo de ejecución.Repite por namespace
En lugar de reescribir todo el código de una vez, mueve un grupo lógico de modelos (por ejemplo, todas las entidades relacionadas con la facturación) a atributos y luego repite el proceso con el siguiente grupo. Esto limita el radio de impacto de cualquier regresión.
Herramientas y redes de seguridad
- Rector – Una herramienta de refactorización automatizada que puede convertir la sintaxis repetitiva de propiedades en atributos. Ejecútala en una copia del código, revisa la diferencia (diff) y aplica los cambios que parezcan correctos.
- Pruebas automatizadas – Las utilidades de prueba integradas de Laravel detectan discrepancias en la asignación masiva y en la salida JSON. Mantén los tests en verde tras cada paso de la migración.
- Feature flags – Si necesitas revertir los cambios rápidamente, envuelve el uso de los nuevos atributos tras una bandera (flag) que permita alternar entre la configuración antigua y la nueva.
Cuándo podrías saltarte la migración
Si un proyecto es pequeño, estable y rara vez se toca, el beneficio de tener modelos más limpios puede no compensar el esfuerzo de la conversión. La sintaxis de atributos es opcional; puedes seguir utilizando el enfoque clásico de propiedades indefinidamente. Por el contrario, para aplicaciones en desarrollo activo, especialmente aquellas con modelos grandes o cambios frecuentes de esquema, adoptar los atributos de forma temprana reduce la fricción futura.
Qué esperar a continuación
El soporte de atributos de Laravel 13 se extiende más allá de los modelos hacia los escuchadores de eventos, las notificaciones, los mailables y los eventos de broadcast. A medida que la comunidad adopte la sintaxis en esas áreas, surgirán patrones de refactorización similares. Mantente atento a la guía oficial de actualización para conocer cualquier nueva clase de atributo que se incorpore en futuras versiones menores.
Conclusión: Laravel 13 te ofrece un camino sin coste hacia modelos más ligeros y más amigables con el IDE. Convierte un espacio de nombres a la vez, apóyate en Rector y en tu suite de pruebas, y terminarás con clases que se leen como especificaciones de negocio en lugar de archivos de volcado de configuración.
