Laravel 13の新機能、PHPアトリビュートとJSON:API
【最新Laravelアップデート解説】Laravelの変更点まとめ 第2回
PHPフレームワークのデファクトスタンダードの位置をしめているLaravelに関して、そのアップデート内容を紹介するのが本連載です。前回は、Laravel13で組み込まれたAI機能を紹介しました。今回は、Laravel 13で新たに導入されたAI以外の仕組みを2個紹介します。さらに、Larvel 13と同時にメジャーアップデートしたInertia 3の変更点も紹介します。
プロパティによる設定記述から解放される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 |
この記事は参考になりましたか?
- 【最新Laravelアップデート解説】Laravelの変更点まとめ連載記事一覧
-
- Laravel 13の新機能、PHPアトリビュートとJSON:API
- AIで進化するLaravel開発の世界――BoostとLaravel AI SDK
- この記事の著者
-
WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
CodeZine編集部(コードジンヘンシュウブ)
CodeZineは、株式会社翔泳社が運営する開発者のための情報メディアです。日々の開発に取り組むエンジニアやテクノロジーを学びたい方に向けて、プログラミングやAI活用、開発ツール、エンジニアの学びとキャリアに関する記事をお届けしています。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
