Laravel 9 がリリースされました。Laravel 9 は LTS であり 2025-02-08 までセキュリティ修正の対象になることが予定されています。追記:Symfonyのアップデート戦略の変更に合わせる形で LTS でなくなりました。2024-02-08 までセキュリティ修正の対象です。
Laravel 9 is Now Released! | Laravel News
A look at what is coming to Laravel 9 | Laravel News
1年半振りのメジャーバージョンアップ(予定)!Laravel9の新機能ピックアップ! – Qiita
色々と機能追加と変更が入っています。より脆弱性の埋め込みの様な事故を起こしにくく、より快適に開発ができる様になっています。更新用ガイドは次です。全てをテストし直さなくとも、この更新ガイドにある破壊的変更の点が関わる部分だけテストすれば更新による不具合は抑えられます。
Upgrade Guide – Laravel – The PHP Framework For Web Artisans
細かい部分は上記 Upgrade Guide を見た方がいいとして、大きな破壊的変更点とその解決の道筋を紹介します。
一つ目は Laravel を動かすのに PHP8 以降が前提となったことです。PHP のバージョンをあげる都合上、Laravel 以外の影響も大きいです。特に 7.4 から 8.0 はあいまいな比較の評価結果をはじめとして多くが変わっています。これに関してはPHPのバージョンを上げて起きるようになったエラーを片っ端からつぶし、インターフェースが変わらず振る舞いが変わった部分のコードを検索して、そこをテストとなります。
PHP: PHP 7.4.x から PHP 8.0.x への移行 – Manual
PHP: PHP 8.0.x から PHP 8.1.x への移行 – Manual
二つ目はファイルストレージ機能のふるまいの変更です。具体的には次の様に変わりました。
項目 | 8.x以前 | 9.0以降 |
---|---|---|
既存ファイルが存在するファイルパスへの書き込み | 上書きしない | 上書きする |
ファイルが存在しないファイルパスの読み込み | 例外 FileNotFoundException が投げられる | nullが返る |
ファイルが存在しないファイルパスの削除 | falseが返る | trueが返る |
一番上の上書きについては元から”上書きする”の様に思うのですがマイグレーションガイドにはそうありますので、何かしら条件が整うと”上書きしない”になるのやもしれません。それはさておきとにかくメソッドの名前や型は変わらずにふるまいだけ変わっているのでテスト必須です。この部分については要は既存ファイルの有無によって振る舞いが変わっていますので、次の様に if 文を追加していい感じに制御すればよいです。
// Laravel 8 以前 \Storage::get('ファイルが存在しないファイルパス'); // Laravel 9 以降で Laravel 8 以前の挙動を再現する $path = 'ファイルが存在しないファイルパス'; if(!\Storage::exists($path)){ // このコードでは例外だが、プログラムの目的に応じてこの時点でいい感じに処理をわけるとかも全然あり throw new \Illuminate\Contracts\Filesystem\FileNotFoundException(); } \Storage::get($path);
三つ目はメーラーライブラリの変更です。Laravel8 以前に使われていた Swift Mailer がメンテナンスされなくなったことに伴い Symfony Mailer に変更されました。
Sending Emails with Mailer (Symfony Docs)
Laravel が公開している public なメソッドを使うのみでしたら問題はほとんどありません。undefined method と化した swift ほにゃららを代替のメソッド(主に symfony ほにゃらら)に置き換えるだけです。一方でLaravelのメーラー実装に依存することをしていた場合、最も大きな破壊的変更です。しばしばみる Laravel で ISO-2022-JP 形式のメールを送る以下の実装などが使えなくなりました。
/* 使えなくなった処理 */ // メールのエンコード形式を ISO-2022-JP に変更する Swift_DependencyContainer::getInstance() ->register('mime.qpheaderencoder') ->asAliasOf('mime.base64headerencoder'); Swift_Preferences::getInstance()->setCharset('iso-2022-jp');
【Laravel】Laravel 内で送るメール全ての文字コードを UTF-8 と ISO-2022-JP で切り替える – 株式会社シーポイントラボ | 浜松のシステム・RTK-GNSS開発
【Laravel】メールの SMTP 通信ログを取る方法 – 株式会社シーポイントラボ | 浜松のシステム・RTK-GNSS開発
現状解決していませんが、この辺りは Laravel や Symfony Mailer を読んでどうにかすることになりそうです。