プロパティによる設定記述から解放されるPHPアトリビュートのサポート
本連載は、Laravelの変更点を紹介する連載です。今回は、Laravel 13で導入された新たな機能を2つ紹介します。最初に紹介するのは、PHPアトリビュートのサポートです。
本連載のサンプルデータは、GitHubから参照できます。今回追加された新しいサンプルも、前回紹介したBoostを利用して作成しています。
PHPアトリビュートとは
PHPアトリビュートとは、PHP 8.0で導入された新たな仕組みです。Javaのアノテーションと同じ働きであり、クラスそのものやクラスのメンバー、関数などPHPの構成要素のメタデータを指定できます。しかも、その内容は実行時にチェックされるようになります。
PHPアトリビュートは、次のコードの#[ ]の記述が該当します。このサンプルコードでは、oldFunction()関数がDeprecated(=非推奨)であることが実行時にチェックされるようになります。
#[Deprecated("この関数は古いので、…")]
function oldFunction() {
:
}
LaravelでのPHPアトリビュートの利用
このPHPアトリビュートを、Laravel 13からはモデルなどでも利用できるようになりました。そのため、特に設定関連でプロパティとして記述していたコードをアトリビュートとして指定できるようになっています。
たとえば、Eloquentのモデルを作成する際、データベース上のテーブル名がEloquentの規約から外れた場合に、利用テーブル名を指定する必要があります。その場合、バージョン12までは次のように$tableプロパティに定義していました。
class Cocktail extends Model
{
protected $table = "cocktail";
:
}
これがバージョン13では、PHPアトリビュートを使って次のように記述できます。
#[Table("cocktail")]
class Cocktail extends Model
{
:
}
クラスのアトリビュートとして設定情報が定義できるため、設定情報としてのプロパティと通常のデータを保持するためのプロパティが混在することがなく、スッキリとしたコードになります。なによりも、モデルクラス宣言部分に設定情報がまとまって記載されているので、可読性も向上します。現状、これまでのプロパティによる定義もサポートされています。
Laravelの公式ドキュメントで確認できる主なPHPアトリビュート
PHPアトリビュートがバージョン13でサポートされるようになったとはいえ、Laravel本体の主要部分では、まだそれほど多くの設定情報がPHPアトリビュートに移行されたわけではありません。
ここでは、公式ドキュメント上で確認できる主なものとして、モデル、コントローラー、キューを表形式で掲載しておきます(※)。
※LaravelのAPI仕様書では、さまざまなクラスに対するアトリビュートが用意されているのが確認できるため、今後、公式ドキュメントへの反映も増えていくと予想されます。
モデルに関する主なものを表1にまとめておきます。
| PHPアトリビュート | 内容 | 旧来の書き方 |
|---|---|---|
| #[Table("テーブル名")] | 利用テーブルの指定 | $table ="テーブル名" |
| #[Table(key: "カラム名")] | 主キーカラムの指定 | $primaryKey = "カラム名" |
| #[WithoutIncrementing] | 主キーの自動採番のオフ設定 | $incrementing = false |
| #[WithoutTimestamps] | created_atカラムとupdated_atカラムが存在しないテーブルの場合の設定 | $timestamps = false |
| #[Connection("DB接続名")] | デフォルトのデータベース接続以外を利用する場合の設定 | $connection = "DB接続名" |
| #[Fillable(["カラム名", …])] | 一括代入を許可するカラムリスト | $fillable = ["カラム名", …] |
| #[Unguarded] | 全てのカラムで一括代入を許可する設定 | $guarded = [] |
コントローラーでのミドルウェア指定に関するものは、表2の通りです。
| PHPアトリビュート | 内容 | 旧来の書き方 |
|---|---|---|
| #[Middleware("ミドルウェア名")] | コントローラーに適用させるミドルウェアの指定 | ->middleware("ミドルウェア名")(ルーティング登録時に指定) |
| #[Authorize("アクション名", ルートパラメータ)] | Authorizationミドルウェアの指定 | ->middleware("can:アクション名, ルートパラメータ")(ルーティング登録時に指定) |
キューに関するものは表3の通りです。
| PHPアトリビュート | 内容 | 旧来の書き方 |
|---|---|---|
| #[WithoutRelations] | リレーション対象の除外の指定 | コンストラクタ内でwithoutRelations()の実行 |
| #[UniqueFor(秒数)] | ロックを保持する期間を指定 | $uniqueFor = 秒数 |
| #[DebounceFor(秒数)] | デバウンスの指定 | なし(Laravel13の新機能) |
| #[Tries(回数)] | 最大試行回数を指定 | $tries = 回数 |
| #[MaxExceptions(回数)] | 最大例外発生回数を指定 | $maxExceptions = 回数 |
| #[Timeout(秒数)] | タイムアウト秒数を指定 | $timeout = 回数 |
| #[FailOnTimeout] | タイムアウト時に失敗としてマークする指定 | $failOnTimeout = true |
