T-file

一歩踏み出す勇気を全力で応援するブログ

そろそろLaravelのバージョンをアップグレードしたい(6.xから9.0)【詳しく解説していく!】

こんにちは、webエンジニアのtakaです。

Laravelっていいフレームワークですよね。

よく使います。

今回はLaravelのバージョンを6から9にアップグレードしなければならないので、その方法を解説していきます。

それでは行ってみましょう!

そもそもなぜアップグレードが必要か?

それぞれのバージョンにはサポート期限が設定されています。
特にLTS(Long Term Support)に指定されているバージョンは、通常より長い期間セキュリティアップデートが保証されています。
例え新しいバージョンであったとしても、古いLTSのバージョンの方が安定しているということです。

以下がLaravelのバージョン一覧です。

Version Release Bug fix Security fix PHP
10.0 2023-02(未) 2024-08 2025-02
9.0 (LTS) 2022-02 2023-08 2025-02 >= 8.0.2
8.0 2020-09-08 2022-07 2023-01 >= 7.3
7.0 2020-03-03 2020-10-06 2021-03-03 >= 7.2.5
6.0 (LTS) 2019-09-03 2022-09-06 2022-09-06 >= 7.2

私のプロジェクトはバージョン6(LTS)を利用していたのですが、サポート期間が2022年9月に終了してしまうので、より新しいLTSのバージョン9に変更する必要があります

tips!

サポート期間を過ぎたから、自分のプロジェクトが動かなくなるということはないですが、セキュリティー的にサポート期間終了前に次のLTSにアップグレードしよう!

アップグレード方法

バージョンアップは6から9に一気にアップグレードするのではなく、6から7、7から8、8から9と段階でアップグレードします。

既にバージョン7や8の方は適宜読み飛ばしてください。

自分のプロジェクトのバージョンは以下で確認できます。

$ php artisan --version

公式のアップグレードガイドを参考にしていきます。
6.xから7.0へのアップグレード
https://readouble.com/laravel/7.x/ja/upgrade.html
7.xから8.0へのアップグレード
https://readouble.com/laravel/8.x/ja/upgrade.html
8.xから9.0へのアップグレード
https://readouble.com/laravel/9.x/ja/upgrade.html

6.xから7.0にアップグレード(約15分)

まずはcomposer.jsonを変更する必要があります。

composer.json内の以下の値を変更していきます。

laravel/frameworkを ^7.0
nunomaduro/collisionを ^4.1
phpunit/phpunitを ^8.5
laravel/tinkerを ^2.0
facade/ignitionを ^2.0

変更を行ったら、

$ composer update

を実行しましょう。

このようなエラーが出ていたら、

Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 528384 bytes) in phar:///usr/local/bin/composer/src/Composer/DependencyResolver/Pool.php on line 221

以下で一時的にメモリー上限をあげて再度実行!

$ COMPOSER_MEMORY_LIMIT=-1 composer update

場合によってアップグレードしないといけないパッケージがある場合があります。
その場合は、公式を見て適宜修正してください。

$ php artisan --version

で7がでればOKです。

tips!

composer.lockが存在すると、そちらを優先してしまうので削除しておきましょう。
composer updateが成功すると、新しく作成されます。

7.xから8.0にアップグレード(約15分)

7から8も同じようにcomposer.jsonをアップデートしていきます。

guzzlehttp/guzzleを ^7.0.1
facade/ignitionを ^2.3.6
laravel/frameworkを ^8.0
laravel/uiを ^3.0
nunomaduro/collisionを ^5.0
phpunit/phpunitを ^9.0

次に my-app/databese/seeds を my-app/database/seeder にフォルダ名を変更します。

そして各seederファイルに名前空間の追記を行います。

編集前

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

編集後

namespace Database\Seeders; // 追加

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

それではアップデートしていきましょう。

$ composer update

なんかエラーでました。

  [RuntimeException]                                                                                  
  Could not scan for classes inside "database/seeds" which does not appear to be a file nor a folder 

psr-4という、seedをcsvファイルから作成できるプラグインを入れていたため、composer.json内にさっき変更したseedsフォルダのパスの記載が残っていました。
composer.jsonを変更します。
編集前

        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeds/"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ]

編集後

        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/" //編集
        },
        "classmap": [
            "database/seeders", //編集
            "database/factories"
        ]

再度composer updateを実行し

$ php artisan --version

で8がでればOKです。

8.xから9.0にアップグレード(約30分)

8から9へのアップグレードは気合が入ります。がんばりましょう!

まずPHP8.0.2以上なので、PHPのバージョンを上げましょう!

ローカル環境のPHPをまず上げます。

※dockerの方は適宜対応してください。

私はMAMPを利用しているのでMAMPのPHPのバージョンを上げます。

MAMPのPHPのバージョンを変更

画像の「PHP version」からPHPのバージョンを変更できます。

変更したら、serverをstop->startで再起動しよう!

$ php -v

これで8.0.2とかになっているはずです。

tips!

もしMAMPのPHPの選択肢に8.0.2以上がない場合は、MAMPの公式から最新版をダウンロードします。

MAMPの最新版をダウンロード

今まで利用していた[/Applications/MAMP]は、上書きされたら困るので一旦別名に変更します。
[/Applications/MAMP] -> [/Applications/MAMP_ORIGIN]

先ほどダウンロードしたMAMPのインストーラーを実行すると、最新版のMAMPがApplications配下に作成されます。

/Applications/MAMP/bin/php/ 配下にphp8.0.8があると思うのでそれを /Applications/MAMP_ORIGIN/bin/php/ 内にコピーします。
bin
最新版の/Applications/MAMPを削除し、今まで利用したMAMP_ORIGINの名前をMAMPに戻し、MAMPアプリを再起動すると選択肢にPHP8.0.8が出ているはずです。

tips!

Apache couldn't be started. Please check your MAMP installation and configuration.
PHPのバージョンを変更しStart Servers をクリックすると「Apache couldn’t be started. Please check your MAMP installation and configuration.」というエラーが表示されます。
Apache Portを80、Nginx Portを80、MySQL Portを3306に設定
このようになったら、MAMPのPreference -> Portsを開き、Apache Portを80、Nginx Portを80、MySQL Portを3306に設定し再起動すると、うまくサーバーを起動できます。

MAMPのPHPのバージョンを変更しても反映されない場合は、パスが通っていない可能性があります。
その場合はbash_profileを編集しましょう。

$ cd ~/
$ vi .bash_profile

i を押しインサートモードにし、
ファイル末に以下を追記します。

export PATH="/Applications/MAMP/bin/php/php8.0.8/bin:${PATH}"

escボタンでインサートモードを終わり、:qwで上書き保存します。

$ source ~/.bash_profile

これで再起動するとPHPのバージョンが変わっています。

次はcomposer.jsonの変更です。

・laravel/frameworkを ^9.0
・nunomaduro/collisionを ^6.1

・facade/ignition 箇所は ”spatie/laravel-ignition”: “^1.0” に変更しましょう。
修正前 “facade/ignition”: “^1.4”,
編集後 “spatie/laravel-ignition”: “^1.0”,

例の如くcomposer.lockは削除しておきましょう。

それではcomposer updateを実行します。

“php”は、開発元を検証できないため開けません。というエラーが出ました。
これは先ほど.bash_profileに追加したphp8.0.8で認証を行なってないからです。
finderから/Applications/MAMP/bin/php/php8.0.8に行きます。
finderからphpを開く
phpという名前のunixファイルをダブルクリックし、聞かれたことに「はい」を押すとOKです。

再度composer updateを実行します。

また、エラーが出ました。
Undefined constant Illuminate\Http\Request::HEADER_X_FORWARDED_ALL
 Undefined constant Illuminate\Http\Request::HEADER_X_FORWARDED_ALL

色々調べるとこの記事が参考になりました。
https://stackoverflow.com/questions/71103241/error-while-updating-laravel-8-to-9-script-php-artisan-packagediscover-ans

1 . app/Http/Middleware/TrustProxies.php を編集します。
編集前

use Fideloper\Proxy\TrustProxies as Middleware;

編集後

use Illuminate\Http\Middleware\TrustProxies as Middleware;

2 . 同ファイルの$headersを編集します。

編集前

protected $headers = Request::HEADER_X_FORWARDED_ALL;

編集後

protected $headers =
Request::HEADER_X_FORWARDED_FOR |
Request::HEADER_X_FORWARDED_HOST |
Request::HEADER_X_FORWARDED_PORT |
Request::HEADER_X_FORWARDED_PROTO |
Request::HEADER_X_FORWARDED_AWS_ELB;

3 . 最後にfideloper/proxyを削除します。

$ composer remove fideloper/proxy

これでOKです。

再度composer updateを実行すると、9.7.0にアップデートできていました!
めでたしめでたし!

tips!

追加
別プロジェクトでlaravel 9にアップグレードしたところ、そのプロジェクトはAWSのS3を利用して追加で対応が必要でした。

修正前

        "league/flysystem-aws-s3-v3": "~1.0",
        "league/flysystem-cached-adapter": "~1.0",

修正後

        "league/flysystem-aws-s3-v3": "^3.0",
        "lustmored/flysystem-v2-simple-cache-adapter": "^0.3.0"

詰まったので共有です。ここを参考にしました。

league/flysystem-cached-adapterは、パフォーマンスを上げるため、絶対に必要なキャッシュアダプタらしいです。

localできたので、本番サーバーもやっちゃいましょう!
今回はAmazon linuxでの説明になります。
ほかのサーバーの場合であっても、基本的にはPHPのバージョンを8.0.2以上あげればOKです。

Amzon linuxにssh接続します。

まずインストールすることのできるソフトウェアおよびバージョンを確認します。

$ sudo amazon-linux-extras | grep php

後はこちらの記事通りでいけました。
https://w.atwiki.jp/sanosoft/pages/204.html

まとめ

この記事でlaravelをアップデートできればと思います。

途中回りくどいことをしているかもしれないので、適宜修正しながらやってください。
それでは!

著者のプロフィールはこちら