Laravel8 を Laravel12 へアップデートした際の対応まとめ

今回は、2つの案件で Laravel 8 → 12 のバージョンアップ対応を行いました。
その際に発生したエラーや、対応中につまずいたポイントを事例としてまとめています。

対応概要

サイト①サイト②
OSRHEL 8.8 → RHEL 8.10
PHP7.4.33 → 8.4系8.1.11 → 8.4系
MariaDB10.5.28(MySQL 5.7系)
WordPress5.2.9 → 6.8
Laravel8.45.1 → 12系8.83.25 → 12系

バージョンアップの進め方

Laravelは一気に最新版へ上げるのではなく、段階的にアップデートを行いました。
各アップデートの手順は、公式のアップグレードガイドを確認しながら進めました。

公式アップグレードガイド

1つバージョンをアップグレードするたびに、以下のコマンドを実行し状態を確認しています。

1つずつ確認しながら進めることで、問題発生箇所の切り分けがしやすくなります。

サイト①で対応したこと

Laravel 8 → 9:Mailer変更による setReturnPath エラー

Laravel 8 から Laravel 9 にバージョンアップした後、フォーム送信した際に「setReturnPath」にエラーが出て送信できなくなりました。

Laravel 9 から、メール送信ライブラリが「SwiftMailer」から「Symfony Mailer」に変更されています。
アップグレードガイドの「”Swift”メソッドの変更」が該当します。

「SwiftMailer」で使用していた setReturnPath() メソッドが利用できなくなりました。
setReturnPath() は、メール送信に失敗した際のエラー通知先(Return-Path)を設定するメソッドです。

「Symfony Mailer」では、メールの各情報(宛先や件名など)と同様に、Return-Pathもヘッダー情報の一つとして設定する仕様になっています。
そのため、getHeaders()->addHeader() を使用して次のように対応しました。

サイト②で対応したこと

Laravel 10 → 11:request->add によるデータ未引き継ぎ

Laravel 10 から Laravel 11 にバージョンアップした後、新規登録などのフォームで、確認画面から完了画面へ進む前にエラーが発生するようになりました。

最初はフォームで入力した name が取得できていないことが原因かと思いましたが、調査したところ、処理に渡されるフォームのデータ自体が空配列になっていました。
そのため、name だけでなく、他の項目もすべて取得できずエラーが発生していました。

確認画面のコードを確認したところ、リクエストにフォームのデータを追加するために SymfonyのParameterBagである request->add() を使用していました。

これを merge() を使用するように変更しました。

変更したところ、フォームで入力した値が正しく次の処理へ引き継がれ、完了画面まで表示されるようになりました。
他の画面でも同じ問題が発生していたため、->request->add( で検索し、->merge( に置換しています。

Laravel 10 → 11:dump-server による composer エラー

Laravel 10 から Laravel 11 にバージョンアップした際、composer update を実行したときにエラーが発生しました。

こちらは beyondcode/laravel-dump-server が Laravel 11 に対応していないことが原因でした。

また、このパッケージはデバッグのための機能を提供するものですが、LaravelはもともとSymfony VarDumperを利用しており、dump() / dd() の機能でデバッグ可能なため、このパッケージ自体が不要になっていました。

composer.json の該当パッケージ("beyondcode/laravel-dump-server": "^1.0")を削除した後、composer update を実行することでエラーは解消されました。

Laravel 10 → 11(Carbon 3):diffInSeconds の仕様変更

エラーではありませんが、Laravel 11 にバージョンアップした際に見落としがちな変更として、日付操作ライブラリである Carbon の仕様変更があります。アップグレードガイドの「Carbon3」が該当します。

Laravel 11 では Carbon 2 と Carbon 3 の両方がサポートされていますが、Carbon 3 にアップグレードする場合、diffIn* 系メソッドの挙動が変更されています。
主な変更点は以下の通りです。

  • 戻り値が int 型から float 型に変更
  • 差分が絶対値ではなく相対値(符号あり)になる

例えば diffInSeconds() の場合、Carbon 2 では常に正の値が返っていましたが、Carbon 3 では時間の前後関係によって負の値になることがあります。

今回の事例では、次のように時間の差分を取得していました。

この処理について、以下のように修正しています。

  • 整数で扱えるよう int 型にキャスト
  • 第2引数を省略し、符号付きの相対値として扱うように変更

Comments are closed.