Was sind PHP-Attribute?
PHP-Attribute (PHP Attributes) sind eine native, in PHP 8.0 eingeführte Syntax für Metadaten. Sie können Klassen, Methoden, Eigenschaften oder Funktionen mit Metainformationen in der Form#[AttributeName] versehen.
Laravel setzt PHP-Attribute im Framework selbst intensiv ein und ermöglicht damit die deklarative Konfiguration von Jobs und Eloquent-Modellen. In Laravel 13 (v13.2.0) akzeptieren die Queue-Attribute nun auch Enums. Anstelle klassischer Klasseneigenschaften oder Methodenüberschreibungen können Sie mit Attributen lesbaren, kompakten Code schreiben.
Queue-bezogene Attribute
Alle Attribute für Queue-Jobs liegen im NamensraumIlluminate\Queue\Attributes.
#[Queue] — Queue-Namen angeben
Gibt die Standard-Queue an, an die der Job gesendet wird.
Das Attribut
#[Queue] ist auf Attribute::TARGET_CLASS gesetzt und kann daher nur auf Klassen angewendet werden.#[Connection] — Verbindung angeben
Gibt die Standard-Queue-Verbindung an, die der Job nutzt.
#[Backoff] — Backoff-Zeit für Retries angeben
Gibt die Wartezeit (in Sekunden) bis zum erneuten Versuch nach einem fehlgeschlagenen Job an. Mit mehreren Werten können Sie unterschiedliche Wartezeiten pro Retry setzen (variadic).
Backoff zeigt, dass die Klasse für variadic Argumente ausgelegt ist.
int, mehrere Werte als array gespeichert.
#[Tries] — Anzahl der Retries angeben
Gibt die maximale Anzahl an Wiederholungsversuchen bei Fehlschlag an.
#[Timeout] — Timeout angeben
Gibt die maximale Laufzeit des Jobs (in Sekunden) an. Nach dieser Zeit wird der Job zwangsweise beendet.
#[MaxExceptions] — Anzahl erlaubter Exceptions angeben
Wird die angegebene Anzahl an Exceptions überschritten, gilt der Job als fehlgeschlagen. Wird in Kombination mit #[Tries] genutzt.
#[UniqueFor] — Eindeutigkeitsdauer angeben
Gibt die Sperrdauer (in Sekunden) an, während der ein Job nicht mehrfach ausgeführt wird. Nutzung in Kombination mit ShouldBeUnique.
#[DeleteWhenMissingModels] — bei fehlendem Modell löschen
Wenn das vom Job abhängige Eloquent-Modell nicht gefunden wird, wird der Job nicht als Fehler markiert, sondern gelöscht (übersprungen).
#[WithoutRelations] — Beziehungen ausschließen
Sorgt dafür, dass beim Serialisieren des Jobs die Model-Relationen nicht mitgeführt werden. So werden die an die Queue übertragenen Daten schlanker.
#[FailOnTimeout] — Timeout als Fehler werten
Registriert einen Timeout als Job-Fehlschlag (standardmäßig gilt ein Timeout nicht als Fehler).
Mehrere Queue-Attribute kombinieren
Sie können diese Attribute kombinieren, um das Verhalten eines Jobs deklarativ zu konfigurieren.Eloquent-bezogene Attribute
Die Eloquent-Modell-Attribute liegen im NamensraumIlluminate\Database\Eloquent\Attributes. Laravel 13 fügt zahlreiche Attribute hinzu.
#[ScopedBy] — Global Scope angeben
Über ein Attribut geben Sie die Global-Scope-Klasse an, die automatisch auf das Modell angewendet werden soll. Vererbung wird unterstützt; über das Flag IS_REPEATABLE können mehrere Scopes angegeben werden.
booted()-Methode:
#[ObservedBy] — Observer angeben
Über ein Attribut geben Sie die Observer-Klasse an, die dem Modell zugeordnet werden soll. Wie ScopedBy ist auch dieses Attribut IS_REPEATABLE.
AppServiceProvider entfällt.
#[UseEloquentBuilder] — eigenen Query Builder angeben
Über ein Attribut geben Sie den eigenen Eloquent-Builder an, den das Modell verwenden soll.
#[CollectedBy] — eigene Collection angeben
Über ein Attribut geben Sie die eigene Collection-Klasse an, die als Modell-Collection verwendet werden soll.
#[Table] — Tabelleneinstellungen gebündelt angeben
Sie können Tabellenname, Primärschlüssel, Timestamps und weitere tabellenbezogene Einstellungen mit einem einzigen Attribut angeben.
Table sind:
| Parameter | Entsprechende Eigenschaft | Beschreibung |
|---|---|---|
name | $table | Tabellenname |
key | $primaryKey | Spaltenname des Primärschlüssels |
keyType | $keyType | Typ des Primärschlüssels ('int', 'string' usw.) |
incrementing | $incrementing | Auto-Increment des Primärschlüssels |
timestamps | $timestamps | Timestamps aktiv/inaktiv |
dateFormat | $dateFormat | Datumsformat |
#[Scope] — Methode als lokalen Scope definieren
Sie können eine Methode ohne scope-Präfix als lokalen Eloquent-Scope kennzeichnen.
#[UseFactory] — Factory-Klasse angeben
Über ein Attribut geben Sie die eigene Factory-Klasse an, die das Modell verwenden soll.
Weitere Eloquent-Attribute
| Attribut | Beschreibung |
|---|---|
#[Fillable(...$attributes)] | Erlaubte Spalten für Mass Assignment angeben |
#[Guarded(...$attributes)] | Für Mass Assignment geschützte Spalten angeben |
#[Unguarded] | Mass-Assignment-Schutz deaktivieren |
#[Hidden(...$attributes)] | Beim Serialisieren auszuschließende Spalten angeben |
#[Visible(...$attributes)] | Beim Serialisieren einzuschließende Spalten angeben |
#[Appends(...$attributes)] | Beim Serialisieren zu ergänzende Accessoren angeben |
#[Touches(...$relations)] | Beziehungen angeben, deren updated_at bei Änderungen aktualisiert wird |
#[WithoutTimestamps] | Timestamps deaktivieren |
#[WithoutIncrementing] | Auto-Increment des Primärschlüssels deaktivieren |
#[DateFormat(format: '...')] | Datumsformat angeben |
#[UsePolicy(policyClass: '...')] | Zugehörige Policy-Klasse angeben |
#[UseResource(resourceClass: '...')] | Zugehörige API-Resource-Klasse angeben |
#[UseResourceCollection(resourceCollectionClass: '...')] | Zugehörige Resource-Collection-Klasse angeben |
Enum-Unterstützung (neu in v13.2.0)
Ab v13.2.0 akzeptieren#[Queue] und #[Connection] Enums. Damit können Sie statt String-Literalen typsichere PHP-Enums für Queues und Verbindungen verwenden.
Vergleich mit klassischen Klasseneigenschaften
Vorteile der Attribute
- Deklarativ — das Verhalten des Jobs ist sofort am Anfang der Klasse ersichtlich
- Typsicher — mit Enums profitieren Sie von IDE-Vervollständigung und Typprüfung
- Vererbungsfreundlich — Attribute der Elternklasse lassen sich in Unterklassen überschreiben
- Weniger Code — Property-Deklarationen und Method-Overrides entfallen
Nachteile der Attribute
- Keine dynamischen Werte — die Argumente sind Compile-Time-Konstanten; Variablen oder Configwerte sind nicht möglich
- Einarbeitung nötig — im Team kann Übung mit der Attribut-Syntax von PHP 8 erforderlich sein
Wenn dynamische Werte gebraucht werden
Sollen die Werte zur Laufzeit bestimmt werden, verwenden Sie weiterhin Methodenüberschreibungen.Interner Aufbau
Laravel liest Attribute intern über die Reflection API aus. Beim Dispatchen eines Jobs erkennt der TraitReadsQueueAttributes (Bestandteil von InteractsWithQueue) die Attribute per Reflection und setzt die passenden Eigenschaften.
Model::booted() — per Reflection ausgelesen.
Nächste Schritte
Mittelstufe: Queues und Jobs
Lernen Sie die grundlegende Nutzung des Laravel-Queue-Systems.
PHP Reflection API
Detaillierte Erläuterung der Reflection API, mit der Laravel Attribute ausliest.