Skip to main content

Wat zijn PHP-attributes?

PHP-attributes zijn de native metadatasyntaxis die in PHP 8.0 is geïntroduceerd. Je kunt meta-informatie toevoegen aan klassen, methodes, properties, functies en meer in het formaat #[AttributeName]. Laravel omarmt PHP-attributes actief in het framework zelf, zodat je de configuratie van jobs en Eloquent-modellen declaratief kunt beschrijven. In Laravel 13 (v13.2.0) accepteren de queue-attributes nu ook enums. In plaats van de traditionele klasseproperties of method overrides schrijf je met attributes beter leesbare en beknoptere code.
Attributes zijn beschikbaar vanaf PHP 8.0. Omdat Laravel 13 minimaal PHP 8.3 vereist, kun je attributes in alle omgevingen gebruiken.

Queue-gerelateerde attributes

Alle attributes voor queue-jobs zitten in de namespace Illuminate\Queue\Attributes.

#[Queue] — de queuenaam opgeven

Geeft de standaardqueue op waarnaar de job wordt gestuurd.
Vanaf v13.2.0 kun je in plaats van een string ook een enum doorgeven.
Het #[Queue]-attribute heeft Attribute::TARGET_CLASS als target en kan dus alleen op klassen worden toegepast.

#[Connection] — de connectie opgeven

Geeft de standaard-queueconnectie op die de job gebruikt.
Ook hier kun je enums gebruiken.

#[Backoff] — de backoff-tijd voor retries opgeven

Geeft de wachttijd (in seconden) op tot een retry wanneer de job faalt. Als je meerdere waarden doorgeeft, kun je per retry een andere wachttijd instellen (met variadische argumenten).
Als je de implementatie van de Backoff-klasse bekijkt, zie je dat die variadische argumenten accepteert.
Bij één waarde wordt het als int opgeslagen, bij meerdere waarden als array.

#[Tries] — het aantal retries opgeven

Geeft het maximale aantal retries op wanneer de job faalt.

#[Timeout] — een timeout opgeven

Geeft de maximale uitvoeringstijd van de job op (in seconden). Wordt deze tijd overschreden, dan wordt de job geforceerd beëindigd.

#[MaxExceptions] — het toegestane aantal exceptions opgeven

Als er meer exceptions dan het opgegeven aantal optreden, wordt de job als mislukt beschouwd. Je gebruikt dit in combinatie met #[Tries].

#[UniqueFor] — de uniciteitsperiode opgeven

Geeft de lockperiode (in seconden) op die dubbele uitvoering van de job voorkomt. Je gebruikt dit samen met ShouldBeUnique.

#[DeleteWhenMissingModels] — verwijderen bij ontbrekend model

Als het Eloquent-model waarvan de job afhankelijk is niet wordt gevonden, wordt de job verwijderd (overgeslagen) in plaats van als mislukt behandeld.

#[WithoutRelations] — relaties uitsluiten

Zorgt ervoor dat de relaties van een model niet worden meegenomen bij het serialiseren van de job. Zo houd je de data die naar de queue gaat lichtgewicht.

#[FailOnTimeout] — falen bij een timeout

Registreert de job als mislukt wanneer er een timeout optreedt (standaard wordt een timeout niet als mislukking geregistreerd).

Meerdere queue-attributes combineren

Je kunt deze attributes combineren om het gedrag van je job declaratief te configureren.

Eloquent-gerelateerde attributes

De attributes voor Eloquent-modellen zitten in de namespace Illuminate\Database\Eloquent\Attributes. In Laravel 13 zijn er veel attributes toegevoegd.

#[ScopedBy] — een global scope opgeven

Geeft via een attribute de global-scopeklasse op die automatisch op het model wordt toegepast. Overerving wordt ondersteund en met de IS_REPEATABLE-vlag kun je meerdere scopes opgeven.
Wil je meerdere scopes toevoegen, dan herhaal je het attribute of geef je een array door.
Ter vergelijking met de traditionele booted()-methode:

#[ObservedBy] — een observer opgeven

Geeft via een attribute de observerklasse op die aan het model wordt gekoppeld. Net als ScopedBy is dit IS_REPEATABLE.
Je kunt ook meerdere observers opgeven.
De traditionele registratie in de AppServiceProvider is niet meer nodig.

#[UseEloquentBuilder] — een custom query builder opgeven

Geeft via een attribute de custom Eloquent-builder op die het model gebruikt.

#[CollectedBy] — een custom collection opgeven

Geeft via een attribute de custom collectionklasse op die als collectie van het model wordt gebruikt.

#[Table] — tabelinstellingen in één keer opgeven

Met één attribute geef je meerdere tabelgerelateerde instellingen op, zoals de tabelnaam, primary key en timestamps.
De opties die je met het Table-attribute kunt instellen:

#[Scope] — een methode definiëren als local scope

Je kunt een methode zonder het scope-prefix definiëren als Eloquent local scope.

#[UseFactory] — een factoryklasse opgeven

Geeft via een attribute de custom factoryklasse op die het model gebruikt.

Overige Eloquent-attributes

Enum-ondersteuning (toegevoegd in v13.2.0)

In v13.2.0 accepteren #[Queue] en #[Connection] nu enums. Daardoor kun je queues en connecties typeveilig opgeven met PHP-enums in plaats van stringliterals.
Met enums voorkom je typefouten in queue- en connectienamen en profiteer je van IDE-autocomplete. Handig om queue- en connectienamen centraal te beheren voor de hele applicatie.

Vergelijking met traditionele klasseproperties

Voordelen van attributes

  • Declaratief — één blik op het begin van de klasse laat zien hoe de job zich gedraagt
  • Typeveilig — met enums profiteer je van IDE-autocomplete en typechecks
  • Goede samenwerking met overerving — attributes van de ouderklasse kun je in de kindklasse overschrijven
  • Minder code — geen property-declaraties of method overrides nodig

Nadelen van attributes

  • Geen dynamische waarden mogelijk — argumenten van attributes zijn uitsluitend compile-time constanten. Variabelen of waarden uit configuratiebestanden kun je niet gebruiken
  • Gewenning nodig — je team moet mogelijk wennen aan de attribute-syntaxis van PHP 8

Wanneer je dynamische waarden nodig hebt

Wil je een waarde tijdens runtime bepalen, dan gebruik je de traditionele method override.
Attributes worden geanalyseerd tijdens het compileren van PHP. Runtime-waarden zoals config() of env() kun je niet gebruiken. Heb je dynamische configuratie nodig, blijf dan klasseproperties of methodes gebruiken.

Hoe de implementatie werkt

Laravel gebruikt intern de Reflection API om attributes uit te lezen. Wanneer de queue worker een job dispatcht, detecteert de trait ReadsQueueAttributes (onderdeel van InteractsWithQueue) de attributes via reflectie en zet de waarden op de bijbehorende properties.
Ook de attributes van Eloquent-modellen worden op een vergelijkbaar moment — vergelijkbaar met Model::booted() — via reflectie uitgelezen.

Volgende stappen

Gemiddeld niveau: queues en jobs

Leer het basisgebruik van het queuesysteem van Laravel.

PHP Reflection API

Een gedetailleerde uitleg van de Reflection API die Laravel gebruikt om attributes uit te lezen.
Laatst gewijzigd op 6 september 2026