Skip to main content

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.
Los atributos están disponibles desde PHP 8.0. Como Laravel 13 requiere PHP 8.3 o superior, puedes usarlos en cualquier entorno soportado.

Atributos relacionados con colas

Todos los atributos relacionados con jobs están en el namespace Illuminate\Queue\Attributes.

#[Queue] — nombre de la cola

Indica el nombre por defecto de la cola a la que se envía el job.
Desde v13.2.0 también puedes pasar un enum en lugar de una cadena.
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.
También admite enums.

#[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).
Al ver la implementación de Backoff, se aprecia que está diseñado para aceptar argumentos variádicos.
Si hay un solo valor, se guarda como 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 namespace Illuminate\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.
Para varios scopes, repite el atributo o pásalos como array.
Comparación con la forma tradicional en booted().

#[ObservedBy] — indicar un observer

Indica mediante atributo la clase observer asociada al modelo. También es IS_REPEATABLE, como ScopedBy.
Puedes indicar varios observers.
Ya no es necesario el registro tradicional en 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.
Las opciones que puedes configurar con el atributo Table:

#[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

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.
Con enums evitas errores tipográficos en nombres de cola o conexión y aprovechas el autocompletado del IDE. Es muy útil para gestionar de forma centralizada los nombres de cola y conexión en toda la aplicación.

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.
Los atributos se analizan en tiempo de compilación de PHP. No puedes usar valores en tiempo de ejecución como config() o env(). Si necesitas configuración dinámica, sigue empleando propiedades o 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 trait ReadsQueueAttributes (incluido en InteractsWithQueue) los detecta mediante reflexión y les asigna los valores a las propiedades correspondientes.
Los atributos de los modelos Eloquent se leen por reflexión de forma análoga, aproximadamente en el momento de 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.
Última modificación el 13 de julio de 2026