Qué son los atributos de PHP
Los atributos de PHP (PHP Attributes) son una sintaxis nativa de metadatos introducida en PHP 8.0. Permiten asignar información meta a clases, métodos, propiedades o funciones con la forma#[AttributeName].
Laravel adopta ampliamente los atributos de PHP en el framework y permite declarar de forma más expresiva la configuración de jobs y modelos Eloquent. En Laravel 13 (v13.2.0), los atributos de cola aceptan enums. En lugar de propiedades de clase o de sobrescribir métodos, puedes usar atributos para escribir código más legible y conciso.
Atributos relacionados con colas
Todos los atributos relacionados con jobs están en el namespaceIlluminate\Queue\Attributes.
#[Queue] — nombre de la cola
Indica el nombre por defecto de la cola a la que se envía el job.
El atributo
#[Queue] está declarado con Attribute::TARGET_CLASS, por lo que solo se puede aplicar a clases.#[Connection] — indicar la conexión
Indica la conexión de cola por defecto que usará el job.
#[Backoff] — tiempo de espera entre reintentos
Indica el tiempo de espera (en segundos) hasta el siguiente reintento cuando falla el job. Aceptando varios valores, puedes configurar tiempos distintos por reintento (variadic).
Backoff, se aprecia que está diseñado para aceptar argumentos variádicos.
int; si hay varios, como array.
#[Tries] — número de reintentos
Indica el número máximo de reintentos al fallar el job.
#[Timeout] — indicar el timeout
Indica el tiempo máximo de ejecución (en segundos) del job. Si se supera, se aborta forzosamente.
#[MaxExceptions] — número máximo de excepciones toleradas
Considera fallido el job si ocurren más excepciones de las indicadas. Se usa junto a #[Tries].
#[UniqueFor] — periodo de unicidad
Indica el periodo de bloqueo (en segundos) para evitar la ejecución duplicada del job. Se combina con ShouldBeUnique.
#[DeleteWhenMissingModels] — eliminar cuando no exista el modelo
Si el modelo Eloquent del que depende el job no existe, se trata como eliminado (se salta) en lugar de fallido.
#[WithoutRelations] — excluir relaciones
Evita incluir las relaciones del modelo al serializar el job. Reduce el peso de los datos enviados a la cola.
#[FailOnTimeout] — marcar como fallo al agotarse el tiempo
Registra el timeout como fallo (por defecto no se registra como tal).
Combinar varios atributos de cola
Puedes combinar estos atributos para declarar de forma expresiva el comportamiento del job.Atributos relacionados con Eloquent
Los atributos para modelos Eloquent están en el namespaceIlluminate\Database\Eloquent\Attributes. Laravel 13 añade muchos atributos.
#[ScopedBy] — indicar un global scope
Indica mediante atributo la clase de scope global que se aplica automáticamente al modelo. Admite herencia y, gracias al flag IS_REPEATABLE, varios scopes.
booted().
#[ObservedBy] — indicar un observer
Indica mediante atributo la clase observer asociada al modelo. También es IS_REPEATABLE, como ScopedBy.
AppServiceProvider.
#[UseEloquentBuilder] — indicar un query builder personalizado
Indica mediante atributo el Eloquent Builder personalizado que usará el modelo.
#[CollectedBy] — indicar una collection personalizada
Indica mediante atributo la clase de collection personalizada que representa las colecciones del modelo.
#[Table] — configuración de tabla en un solo atributo
Indica en un único atributo varios ajustes relacionados con la tabla: nombre, clave primaria, timestamps, etc.
Table:
| Parámetro | Propiedad equivalente | Descripción |
|---|---|---|
name | $table | Nombre de la tabla. |
key | $primaryKey | Nombre de la columna de clave primaria. |
keyType | $keyType | Tipo de la clave primaria ('int', 'string'…). |
incrementing | $incrementing | Si la clave primaria es autoincremental. |
timestamps | $timestamps | Activar/desactivar timestamps. |
dateFormat | $dateFormat | Formato de fecha. |
#[Scope] — definir un método como local scope
Permite declarar un método como local scope de Eloquent sin necesidad del prefijo scope.
#[UseFactory] — indicar la clase factory
Indica mediante atributo la clase factory personalizada que usará el modelo.
Otros atributos de Eloquent
| Atributo | Descripción |
|---|---|
#[Fillable(...$attributes)] | Columnas permitidas en asignación masiva. |
#[Guarded(...$attributes)] | Columnas protegidas frente a asignación masiva. |
#[Unguarded] | Desactiva la protección de asignación masiva. |
#[Hidden(...$attributes)] | Columnas excluidas al serializar. |
#[Visible(...$attributes)] | Columnas incluidas al serializar. |
#[Appends(...$attributes)] | Accesores que se añaden al serializar. |
#[Touches(...$relations)] | Relaciones cuyo updated_at se actualiza al modificar. |
#[WithoutTimestamps] | Desactiva los timestamps. |
#[WithoutIncrementing] | Desactiva el auto-incremento de la clave primaria. |
#[DateFormat(format: '...')] | Indica el formato de fecha. |
#[UsePolicy(policyClass: '...')] | Indica la clase policy asociada. |
#[UseResource(resourceClass: '...')] | Indica la clase resource API asociada. |
#[UseResourceCollection(resourceCollectionClass: '...')] | Indica la clase de resource collection asociada. |
Soporte de enums (añadido en v13.2.0)
En v13.2.0,#[Queue] y #[Connection] aceptan enums. Así puedes indicar cola y conexión de forma tipada, en lugar de con literales string.
Comparación con las propiedades de clase tradicionales
Ventajas de los atributos
- Declarativos — con solo mirar el encabezado de la clase entiendes el comportamiento del job.
- Tipados — al usar enums, tienes autocompletado y comprobación de tipos.
- Compatibles con la herencia — puedes sobrescribir en la subclase los atributos de la clase padre.
- Menos código — no hacen falta declaraciones de propiedades ni sobrescribir métodos.
Desventajas de los atributos
- No se puede fijar un valor dinámico — los argumentos son constantes de compilación. No aceptan variables ni valores de configuración.
- Requiere costumbre — puede que tu equipo necesite tiempo para acostumbrarse a la sintaxis de PHP 8.
Cuando necesitas valores dinámicos
Si necesitas decidir el valor en tiempo de ejecución, sigue usando la sobrescritura de métodos.Cómo se implementa
Internamente, Laravel usa la Reflection API para leer los atributos. Cuando el worker de la cola despacha un job, el traitReadsQueueAttributes (incluido en InteractsWithQueue) los detecta mediante reflexión y les asigna los valores a las propiedades correspondientes.
Model::booted().
Próximos pasos
Intermedio: Colas y jobs
Aprende el uso básico del sistema de colas de Laravel.
PHP Reflection API
Explica en detalle cómo Laravel usa la Reflection API para leer los atributos.