Laravel Advent Calendar 2021 1日目の投稿です。
来月(2022年1月)、1年半ぶりのLaravelのメジャーバージョンアップするのでLaravel9の主要な変更点をまとめてみました。
リリース日
- Laravel 8: 2020年9月
- Laravel 9: 2022年1月(予定)
- Laravel 10: 2023年1月(予定)
- Laravel 11: 2024年1月(予定)
Symfony6.0が2021年11月30日にリリースされました。それに伴ってLaravel 9のリリースが2022年1月に延期されています。
また、Laravel 9以降は半年周期のメジャーリリースが1年周期になっています。
Version | PHP (*) | Release | Bug Fixes Until | Security Fixes Until |
---|---|---|---|---|
6 (LTS) | 7.2 - 8.0 | September 3rd, 2019 | January 25th, 2022 | September 6th, 2022 |
7 | 7.2 - 8.0 | March 3rd, 2020 | October 6th, 2020 | March 3rd, 2021 |
8 | 7.3 - 8.1 | September 8th, 2020 | July 26th, 2022 | January 24th, 2023 |
9 (LTS) | 8.0 - 8.1 | January 25th, 2022 | January 30th, 2024 | January 28th, 2025 |
10 | 8.0 - 8.1 | January 24th, 2023 | July 30th, 2024 | January 28th, 2025 |
インストール要件
最低でも PHP8.0 以上である必要があります。
Laravel 9の内部でSymfony6.0が利用されており、PHP8.0が最小要件があるためLaravel 9にも同じ制限が適用されます。
新機能ピックアップ
Anonymous Stub Migrations
Laravel v8.37.0 でクラス名の衝突を防ぐために匿名マイグレーション機能がリリースされました。
Laravel 9.xでは php artisan make:migration
実行時に生成されるファイルが匿名マイグレーションがデフォルトとなります。(Laravel8.xではデフォルトのマイグレーションテンプレートはクラス名付きで生成されますが、匿名マイグレーションは利用可能です。)
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('people', function (Blueprint $table) {
$table->string('first_name')->nullable();
});
}
};
これにより名前被りを気にせずマイグレーションファイルを作成できます。
マイグレーションファイル名は日付プレフィックスが付くので同名ファイルでも問題ありません。
また、稀によく発生していたマイグレーションクラスをリネームしてオートローダーが壊れる問題もこれで解消されそうです。
新しくクエリビルダーインターフェイスが追加
Illuminate\Database\Eloquent\Relations
Illuminate\Database\Eloquent\Builder
Illuminate\Database\Query\Builder
これらのクエリビルダークラス群が1つのインターフェース Illuminate\Contracts\Database\Query\Builder
と契約しました。
文字列関数の内部実装の変更
最小要件がPHP8.0ということで、下記の関数の内部実装が変更されています。
Str::contains();
Str::startsWith();
Str::endsWith();
str_contains()
、str_starts_with()
および str_ends_with()
関数が利用されています。
現時点では特に非推奨となっていませんが、PHPの標準関数で実現できるので今後はもしかしたら非推奨になる関数かもしれませんね。
SwiftMailerからSymfonyMailerへ
SwiftMailerが非推奨となり、Laravel9ではSymfonyMailerを使用するように変更されています。
lang ディレクトリがトップレベルへ
Laravel8までは resources/lang
でしたがLaravel9からトップレベルへ移動されました。
Flysystem v2
AWS S3をLaravelで操作したい時に使うライブラリthephpleague/flysystem-aws-s3-v3
v2系はLaravel8で動作しませんでしたが、Laravel9からv2系がサポートされます。
アップグレードの際はご注意ください。
https://github.com/laravel/framework/pull/33612
https://qiita.com/ucan-lab/items/61903ce10a186e78f15f
Laravel インストーラにAPIオプションの追加
$ laravel new foo --api
HTMLを返さないAPIシステムのためのapiオプションがLaravelインストーラに追加されるそうです。
css, js関連ファイルが削除されたLaravelプロジェクトテンプレートを構築します。
(管理画面はやっぱり簡単なHTMLを返したいとかありそう...笑 簡単に戻せるならアリかな?)
server.php がLaravelのプロジェクトルートから削除
server.php
は php artisan server
のコマンドを実行する際に使用されるファイルです。
laravel/laravel
のルートディレクトリ配下にあった server.php が laravel/framework
のフレームワーク本体の src/Illuminate/Foundation/resources/server.php
に移動になりました。
Laravel9へアップグレードした際は不要なファイルになるのでこのファイルを削除する必要がありそうです。
Laravel8で追加された新機能
Laravel8.xで新しく追加された機能で気になったものをご紹介します。
Eloquent N+1検知機能
Laravel v8.43.0 でN+1検知機能がしれっと追加されていました。
N+1クエリーがあると例外が発生するため開発プロセスの初期段階でN+1クエリーを発見できます。
https://laravel-news.com/disable-eloquent-lazy-loading-during-development
https://github.com/laravel/framework/pull/37363
https://github.com/laravel/framework/releases/tag/v8.43.0
Enum型のサポート
Laravel v8.71.0 でEnum型を便利に扱えるようにキャスト機能やクエリー周りのサポートが行われています。
https://github.com/laravel/framework/pull/39608
https://github.com/laravel/framework/pull/39492
https://github.com/laravel/framework/pull/39597
https://github.com/laravel/framework/releases/tag/v8.71.0
https://github.com/laravel/framework/releases/tag/v8.70.0