every Tech Blog

株式会社エブリーのTech Blogです。

Laravel12のバージョンアップ変更点を見てみる

はじめに

こんにちは、リテールハブ開発部でバックエンドエンジニアをしています。
現在、小売アプリの開発でLaravel11を利用してAPI開発を行っています。

先日2月24日にLaravel12がリリースされました。 (https://laravel.com/docs/12.x/releases
今回のリリースは、比較的マイナー変更中心の「メンテナンスリリース」となっているようです。

Laravel11は昨年の夏頃から使用しているのですが、まだまだ最新バージョンの認識で直近でバージョンアップを行う予定もありませんでした。
ただ、以下のサポート対応表を見ると、Laravel11でもあと1年程度でサポート対象外となることがわかります。

公式ではLaravelの方針として12ヶ月ごとにメジャーアップデートしていきたいとのことなので、 今後を考慮して、定期的にバージョンアップできるような体制にしておいた方が良さそうだと思いました。

そこで今回、Laravel11からLaravel12にバージョンアップすることでどんな変更点があるのか、 私の開発している環境ではどんな影響がありそうかをコメントしながらご紹介したいと思います。
各変更点に関するコメントについては、環境によっては一部内容が異なることもあると思いますので、参考程度にご覧いただければ幸いです。

Laravel12のバージョンアップ方法について

Laravel11からのバージョンアップは非常に簡単で、
アプリケーションの「composer.json」ファイルのバージョンを更新することでバージョンアップできます。

 "laravel/framework": "^12.0"
 "phpunit/phpunit": "^11.0"
 "pestphp/pest": "^3.0"

Laravel12の変更点について

Laravel11からLaravel12にすることによる変更点を公式で記載されている内容に沿って順番にご紹介したいと思います。
全体的に大きな変更点は控えめで、バージョンアップによるコード修正の影響も少ない気はしています。

Carbon2.xの終了

Carbon2.xのサポートが終了しました。
Laravel12では、Carbon3.xを使用する必要があります。

Laravel11ですでにCarbon3.xを使用しているのであれば特に今回の変更による影響はなさそうです。

Laravelインストーラー、スターターキットの更新

LaravelインストーラーCLIツールを使用して新しいLaravelアプリケーションを作成する場合は、 インストーラーを更新して、Laravel12、新しいLaravelスターターキットと互換性を持たせる必要があります。

新しいインストーラーを使用するとReact、Vue、Livewireのスターターキットを選択できるようで、 プロジェクトによってはこれを利用することで初期構築がしやすくなるかもしれません。

私の環境ではこちらを利用する機会は無さそうですが、この部分が今回のバージョンアップによる大きな変更点でもあるようです。

Concurrencyの利便性向上

並列処理で使用するメソッドとして、Concurrencyメソッドがありますが、 連想配列を使用してメソッドを呼び出すと、同時操作の結果が関連付けられたキーとともに返されるようになりました。

  • バージョンアップ前
$result = Concurrency::run([
    fn () =>  1 + 1,
    fn () =>  2 + 2,
]);

// $result => [ 2, 4 ]
  • バージョンアップ後
$result = Concurrency::run([
    'task-1' => fn () => 1 + 1,
    'task-2' => fn () => 2 + 2,
]);
 
// $result => ['task-1' => 2, 'task-2' => 4]

まだConcurrencyを使用した並列処理はサービス上に実装したことはないのですが、
今回の変更でキーも返却されるようになったので、その後の処理は順番を意識せず使えるようになります。
返却順をもとに行なっている処理があれば、今回のタイミングでキー指定による処理に変えられればより安全な処理になりそうです。

Databaseの変更点

データベース処理に関する変更ではなく、定義確認関連の変更点のようでした。
そのため通常のサービスで使用するような変更というよりは、メンテナンスやDB管理で使用するものになりそうです。

  • Schema::getTablesの変更
// テーブルのスキーマ情報をすべて取得する
$tables = Schema::getTables();
 
// スキーマ「main」に関するスキーマ情報を取得する
$table = Schema::getTables(schema: 'main');
 
// スキーマ「main」「blog」に関するスキーマ情報を取得する(複数指定)
$table = Schema::getTables(schema: ['main', 'blog']);

デフォルトですべてのスキーマの結果が含まれるようになりました。
以前のバージョンでは引数によるスキーマ選択ができませんでしたが、 上記のように引数を渡すと、指定されたスキーマの結果のみを取得できるようになりました。

  • Schema::getTableListing()の変更
$tables = Schema::getTableListing();
// $tables => ['main.migrations', 'main.users', 'blog.posts']
 
$table = Schema::getTableListing(schema: 'main');
// $tables => ['main.migrations', 'main.users']
 
$table = Schema::getTableListing(schema: 'main', schemaQualified: false);
// $tables => ['migrations', 'users']

Schema::getTableListing()メソッドは、デフォルトでスキーマ修飾されたテーブル名を返すようになりました。
schemaQualified引数を渡すことで、スキーマ修飾なしの一覧を取得することもできます。

  • db:table、db:showコマンドの変更

PostgreSQLやSQL Serverと同様に、MySQL、MariaDB、SQLiteのすべてのスキーマの結果を出力するようになりました。

主に定義関連の参照が少し便利になった程度でデータベース操作に関する変更ではないので、私の環境ではコード修正の影響は無さそうです。
ただ、すでに使用しているメソッドである場合は修正が必要かもしれません。

Eloquentの変更点

Eloquentの変更点も非常に少なく、HasUuidsトレイトの変更がある程度です。

HasUuidsトレイトは、UUID仕様のバージョン7(順序付き UUID)と互換性のあるUUIDを返すようになりました。
モデルのIDに順序付きUUIDv4文字列を引き続き使用したい場合は、以下のようにHasVersion4Uuidsトレイトを使用する必要があります。

use Illuminate\Database\Eloquent\Concerns\HasUuids; 
use Illuminate\Database\Eloquent\Concerns\HasVersion4Uuids as HasUuids;

HasVersion7Uuidsは削除されました。今まで使用していた場合は、HasUuidsに変更する必要がありそうです。

新しく使用する場合はHasUuidsトレイトをそのまま使用すれば大丈夫そうです。
ただ、すでにHasUuidsトレイトを使用した処理がある場合は、個人的には問題ないと思っていますが、 影響という意味では非常にインパクトはある気はしていますので、バージョンアップ後に問題なく動作するかは念の為検証した方が良さそうです。

Requestの変更点

Requestでは、mergeIfMissingメソッドについて変更がありました。

mergeIfMissingメソッドはリクエストの入力データ内に対応するキーがまだ存在しない場合のみマージしたい時に使用します。 Laravel12からは、ネストされた配列データを「ドット」表記を使用して結合できるようになりました。

$request->mergeIfMissing([
    'shop.shop_name' => 'Sample Shop',
]);

実は上記のメソッドのようにデフォルト値として使用したいケースはあったのですが、今までは以下のような処理で行っていました。

$shop = $request->input('shop', []);

if (!isset($shop['shop_name'])) {
    $shop['shop_name'] = 'Sample Shop';
}

$request->merge(['shop' => $shop]);

今回のバージョンアップ変更の調査で、mergeIfMissingメソッドを使用した方がシンプルに記載できることを知ったので、現状の実装含め導入を検討したいと思いました。

Validationの変更点

Validationでは、画像形式のデフォルト指定に関して変更がありました。

Laravel12からはimageバリデーションルールがデフォルトでsvg画像を許可しなくなりました。 svg画像を許可するためには、バリデーションルールに明示的に指定が必要になります。

  • imageにallow_svgを指定する方法
'photo' => 'required|image:allow_svg'
  • File::imageに指定する方法
use Illuminate\Validation\Rules\File;

'photo' => ['required', File::image(allowSvg: true)],

私の環境ではsvg画像を使用していないため影響はありませんが、 デフォルト指定かつsvg画像のバリデーションチェックをしていた場合は、明示的にルールの指定を追加する必要がありそうです。

最後に

いかがでしたでしょうか。
実際に変更点を見たところでも、今回のメジャーアップデートによる大きな影響は全体的に控えめかなという印象です。
私のプロジェクトの開発環境もコード修正の対応はほぼ無さそうかなと思っています。
とはいえ、実際に正常に動くかは検証が必要ですし、他のライブラリとの関係などもあるため慎重に対応する必要はありそうです。
ただ、冒頭でお話した通り、あっという間にサポート対象外になるので、 良いタイミングでバージョンアップの検討はしていかないといけないと思いました。

今後のLaravelバージョンアップの際にぜひ少しでも参考にしていただければ幸いです。
最後までお読みいただき、ありがとうございました。