Laravel最新バージョンで何が変わったのか — PHP8.3必須化が意味すること
Laravelの最新系はPHP8.3以降が前提です。「上げたほうがよい」という推奨ではなく、フレームワーク本体のcomposer.json(依存パッケージやPHPバージョンを宣言する設定ファイル)に明記された必須要件です。ここを見落とすと、composer updateの段階で止まります。
requireが示す「^8.3」の意味
Illuminateの各コンポーネント、たとえばAuthやBroadcastingのcomposer.jsonを開くと、requireに "php": "^8.3" とあります。^8.3 はキャレット指定と呼ばれ、8.3以上9.0未満を許容する記法です。したがってPHP8.2以前ではインストールそのものが成立しません。
周辺パッケージも足並みを揃えている
この方針は本体に限りません。テスト出力をエージェント向けに最適化する laravel/pao は同じく "php": "^8.3" を要求します。ログをコマンドラインから追う laravel/pail も、composer.jsonで symfony/console に依存しており、新しいPHP環境を前提に整備が進んでいます。周辺まで8.3で揃っているのが最新系の実態です。
アップグレード前に確認すべきパッケージ間のバージョン制約と落とし穴
ただしPHPを上げれば通るとは限りません。厄介なのはパッケージ同士の相性で、これはPHPバージョンとは別のレイヤーで衝突します。
paoのconflict指定が招く依存衝突
特にハマりやすいのが laravel/pao のconflict(共存不可を宣言する項目)です。laravel/framework <12.0.0、nunomaduro/collision <8.9.3、pestphp/pest <4.6.3 || >=6.0.0 などが並び、古い本体やPest(テストフレームワーク)を抱えたままpaoを入れようとすると、Composerが解決不能と判断して Your requirements could not be resolved to an installable set of packages. を返します。エラーはPHP起因に見えて、実際はこのconflict側が原因のことが多い。本体を12以上へ、テスト系も範囲内へ先に揃えるのが回避の筋道です。
追随可否をcomposer.jsonで見極める
導入前に、自分の環境が最新に乗れるかを机上で確認しておけば事故は減ります。手順は単純です。
- 自プロジェクトの
composer.jsonのPHP指定が^8.3を満たせるか - 本体(laravel/framework)を12系以上に上げられるか
composer why-not laravel/paoで衝突相手を先に洗い出す
ローカルの検証環境が未整備なら、Laravel Herdの導入でPHP8.3系を用意してから試すと切り分けが楽になります。バージョン差による挙動は環境に左右されるため、本番反映の前にステージングで一度通しておくと安心です。