PHPアトリビュートとは
PHPアトリビュート(PHP Attributes)は、PHP 8.0で導入されたネイティブのメタデータ構文です。クラス、メソッド、プロパティ、関数などに対して、#[AttributeName] の形式でメタ情報を付与できます。
Laravelはフレームワーク本体でPHPアトリビュートを積極的に採用しており、ジョブやEloquentモデルの設定を宣言的に記述できます。Laravel 13(v13.2.0)ではキューアトリビュートがenumを受け入れるようになりました。従来のクラスプロパティやメソッドオーバーライドの代わりに、アトリビュートを使ってより読みやすく簡潔なコードを書けます。
キュー関連アトリビュート
キュージョブに関するアトリビュートはすべてIlluminate\Queue\Attributes 名前空間にあります。
#[Queue] — キュー名を指定する
ジョブが送られるデフォルトのキュー名を指定します。
#[Queue] アトリビュートは Attribute::TARGET_CLASS をターゲットに設定されているため、クラスに対してのみ適用できます。#[Connection] — コネクションを指定する
ジョブが使用するデフォルトのキューコネクションを指定します。
#[Backoff] — リトライのバックオフ時間を指定する
ジョブが失敗したときのリトライまでの待機時間(秒)を指定します。複数の値を渡すと、リトライごとに異なる待機時間を設定できます(可変長引数対応)。
Backoff クラスの実装を見ると、可変長引数を受け取る設計になっています。
int として、複数の場合は array として格納されます。
#[Tries] — リトライ回数を指定する
ジョブが失敗したときの最大リトライ回数を指定します。
#[Timeout] — タイムアウトを指定する
ジョブの最大実行時間(秒)を指定します。この時間を超えるとジョブは強制終了されます。
#[MaxExceptions] — 許容例外数を指定する
指定した回数以上の例外が発生した場合にジョブを失敗とみなします。#[Tries] と組み合わせて使います。
#[UniqueFor] — ユニーク期間を指定する
ジョブの重複実行を防ぐロック期間(秒)を指定します。ShouldBeUnique と組み合わせて使います。
#[DeleteWhenMissingModels] — モデル未存在時に削除する
ジョブが依存するEloquentモデルが見つからない場合、ジョブを失敗ではなく削除(スキップ)として処理します。
#[WithoutRelations] — リレーションを除外する
ジョブのシリアライズ時にモデルのリレーションを含めないようにします。キューへの送信データを軽量化できます。
#[FailOnTimeout] — タイムアウト時に失敗とする
タイムアウトが発生した場合にジョブを失敗として記録します(デフォルトではタイムアウトは失敗として記録されません)。
複数のキューアトリビュートを組み合わせる
これらのアトリビュートを組み合わせて、ジョブの挙動を宣言的に設定できます。Eloquent関連アトリビュート
EloquentモデルのアトリビュートはIlluminate\Database\Eloquent\Attributes 名前空間にあります。Laravel 13では多数のアトリビュートが追加されています。
#[ScopedBy] — グローバルスコープを指定する
モデルに自動的に適用するグローバルスコープクラスをアトリビュートで指定します。継承をサポートしており、IS_REPEATABLE フラグで複数のスコープを指定できます。
booted() メソッドとの比較です。
#[ObservedBy] — オブザーバーを指定する
モデルに関連付けるオブザーバークラスをアトリビュートで指定します。ScopedBy と同様に IS_REPEATABLE です。
AppServiceProvider での登録が不要になります。
#[UseEloquentBuilder] — カスタムクエリビルダーを指定する
モデルが使用するカスタムEloquentビルダーをアトリビュートで指定します。
#[CollectedBy] — カスタムコレクションを指定する
モデルのコレクションとして使用するカスタムコレクションクラスをアトリビュートで指定します。
#[Table] — テーブル設定をまとめて指定する
テーブル名、主キー、タイムスタンプなど、複数のテーブル関連設定を1つのアトリビュートで指定できます。
Table アトリビュートで設定できるオプションは以下のとおりです。
#[Scope] — メソッドをローカルスコープとして定義する
scope プレフィックスなしのメソッドをEloquentのローカルスコープとして定義できます。
#[UseFactory] — ファクトリクラスを指定する
モデルが使用するカスタムファクトリクラスをアトリビュートで指定します。
その他のEloquentアトリビュート
Enumサポート(v13.2.0で追加)
v13.2.0では、#[Queue] と #[Connection] がenumを受け入れるようになりました。これにより、文字列リテラルの代わりにPHP enumを使って型安全にキューとコネクションを指定できます。
従来のクラスプロパティとの比較
アトリビュートのメリット
- 宣言的 — クラスの冒頭を見ればジョブの挙動が一目でわかる
- 型安全 — enumを使えばIDEの補完と型チェックが効く
- 継承との親和性 — 親クラスのアトリビュートを子クラスで上書きできる
- コードの削減 — プロパティ宣言やメソッドオーバーライドが不要
アトリビュートのデメリット
- 動的な値を設定できない — アトリビュートの引数はコンパイル時定数のみ。変数や設定ファイルの値は使えない
- 読み慣れが必要 — チームでPHP 8のアトリビュート構文に慣れが必要な場合もある
動的な値が必要な場合
実行時に値を決定したい場合は、従来のメソッドオーバーライドを使います。実装の仕組み
Laravelは内部でReflection APIを使ってアトリビュートを読み取ります。キューワーカーがジョブをディスパッチする際に、ReadsQueueAttributes トレイト(InteractsWithQueue に含まれる)がリフレクションでアトリビュートを検出し、対応するプロパティに値を設定します。
Model::booted() 相当のタイミングでリフレクションにより読み取られます。
次のステップ
中級: キューとジョブ
Laravelのキューシステムの基本的な使い方を学びます。
PHP Reflection API
Laravelがアトリビュートを読み取るために使うReflection APIの仕組みを詳しく解説します。