Skip to main content

PHPアトリビュートとは

PHPアトリビュート(PHP Attributes)は、PHP 8.0で導入されたネイティブのメタデータ構文です。クラス、メソッド、プロパティ、関数などに対して、#[AttributeName] の形式でメタ情報を付与できます。 Laravelはフレームワーク本体でPHPアトリビュートを積極的に採用しており、ジョブやEloquentモデルの設定を宣言的に記述できます。Laravel 13(v13.2.0)ではキューアトリビュートがenumを受け入れるようになりました。従来のクラスプロパティやメソッドオーバーライドの代わりに、アトリビュートを使ってより読みやすく簡潔なコードを書けます。
アトリビュートはPHP 8.0以降で利用できます。Laravel 13はPHP 8.3以上を必要とするため、すべての環境でアトリビュートを使用できます。

キュー関連アトリビュート

キュージョブに関するアトリビュートはすべて Illuminate\Queue\Attributes 名前空間にあります。

#[Queue] — キュー名を指定する

ジョブが送られるデフォルトのキュー名を指定します。
v13.2.0以降、文字列の代わりにenumを渡すこともできます。
#[Queue] アトリビュートは Attribute::TARGET_CLASS をターゲットに設定されているため、クラスに対してのみ適用できます。

#[Connection] — コネクションを指定する

ジョブが使用するデフォルトのキューコネクションを指定します。
こちらもenumを使えます。

#[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の補完も利用できます。アプリケーション全体でキュー名とコネクション名を一元管理するのに便利です。

従来のクラスプロパティとの比較

アトリビュートのメリット

  • 宣言的 — クラスの冒頭を見ればジョブの挙動が一目でわかる
  • 型安全 — enumを使えばIDEの補完と型チェックが効く
  • 継承との親和性 — 親クラスのアトリビュートを子クラスで上書きできる
  • コードの削減 — プロパティ宣言やメソッドオーバーライドが不要

アトリビュートのデメリット

  • 動的な値を設定できない — アトリビュートの引数はコンパイル時定数のみ。変数や設定ファイルの値は使えない
  • 読み慣れが必要 — チームでPHP 8のアトリビュート構文に慣れが必要な場合もある

動的な値が必要な場合

実行時に値を決定したい場合は、従来のメソッドオーバーライドを使います。
アトリビュートはPHPのコンパイル時に解析されます。config()env() のような実行時の値を使うことはできません。動的な設定が必要な場合は、引き続きクラスプロパティやメソッドを使用してください。

実装の仕組み

Laravelは内部でReflection APIを使ってアトリビュートを読み取ります。キューワーカーがジョブをディスパッチする際に、ReadsQueueAttributes トレイト(InteractsWithQueue に含まれる)がリフレクションでアトリビュートを検出し、対応するプロパティに値を設定します。
Eloquentモデルのアトリビュートも同様に、Model::booted() 相当のタイミングでリフレクションにより読み取られます。

次のステップ

中級: キューとジョブ

Laravelのキューシステムの基本的な使い方を学びます。

PHP Reflection API

Laravelがアトリビュートを読み取るために使うReflection APIの仕組みを詳しく解説します。
最終更新日 2026年5月11日