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.
Queue-gerelateerde attributes
Alle attributes voor queue-jobs zitten in de namespaceIlluminate\Queue\Attributes.
#[Queue] — de queuenaam opgeven
Geeft de standaardqueue op waarnaar de job wordt gestuurd.
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.
#[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).
Backoff-klasse bekijkt, zie je dat die variadische argumenten accepteert.
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 namespaceIlluminate\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.
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.
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.
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.
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.Hoe de implementatie werkt
Laravel gebruikt intern de Reflection API om attributes uit te lezen. Wanneer de queue worker een job dispatcht, detecteert de traitReadsQueueAttributes (onderdeel van InteractsWithQueue) de attributes via reflectie en zet de waarden op de bijbehorende properties.
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.