Open5

php + laravel バージョンアップ

mugi65mugi65

目的

  • 引き継いだPHP環境がEoLだったためそれぞれのバージョンアップする手順を記載する
  • バージョンアップする際に詰まりそうな箇所を記録する

現状の環境

  • PHP 7.3
  • Laravel 6.20
  • Composer 1.9.0

利用する端末

  • M2 Macbook air

バージョンアップのためのステップ

  1. Composer 1.9.0から Composer latestへアップデート
  2. PHP 7.3からPHP7.4へアップデート
  3. Laravel 6.xからLaravel 8.xへアップデート
    • Laravel 8.xのPHPバージョンが7.3 ~ 8.0までのためここまで
  4. PHP 7.4からPHP 8.0へアップデート
  5. Laravel 8.xからLaravel 9.xへアップデート
    • Laravel 9.xのPHPバージョンが8.0 ~ 8.2までのためここまで
  6. PHP 8.0からPHP 8.2へアップデート
  7. Laravel 9.xからLaravel 11.xへアップデート
    • Laravel 10.x以降はPHPバージョンが8.2以降を利用

サポートバージョン

PHP

https://www.php.net/supported-versions.php

Laravel

mugi65mugi65

ローカル環境の構築

M1 Mac以降だとasdfやanyenvを使ったphpローカル環境がうまく立ち上がらないため、homebrewでローカル環境を構築する。

shivammathur/php を利用し複数環境をインストールする。

brew install php

brew tap shivammathur/php
brew install shivammathur/php/php@7.3
brew install shivammathur/php/php@7.4
brew install shivammathur/php/php@8.0
brew install shivammathur/php/php@8.2

phpバージョンの切り替え

今回はPHPを採用したプロジェクトを1つしか動かさないため brew link コマンドによってPHPのバージョンを段階的に切り替えていく

brew link --overwrite --force shivammathur/php/php@7.3
mugi65mugi65

Composerアップデート

Composer 1.9.0から Composer latestへアップデートする

php 7.3 環境下にインストール

% brew link --overwrite --force shivammathur/php/php@7.3
% php -v                                                
PHP 7.3.33 (cli) (built: Apr 26 2023 19:33:37) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.33, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.33, Copyright (c) 1999-2018, by Zend Technologies

% curl -sS https://getcomposer.org/installer | php -- --version=1.9.0
% mv composer.phar /usr/local/bin/composer

アップデート

% composer                                                                                  
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.9.0 2019-08-02 20:55:32
...

% composer self-update    
Updating to version 2.5.5 (stable channel).
   Downloading (100%)         
Use composer self-update --rollback to return to version 1.9.0
% composer --version
Composer version 2.5.5 2023-03-21 11:50:05

composer install してlockファイルの差分を確認

composer install
mugi65mugi65

php 7.3 から 7.4のアップデート

公式のマイグレーションガイド
https://www.php.net/manual/ja/migration74.php

php 7.4への切り替え

% brew link --overwrite --force shivammathur/php/php@7.4
%  php -v
PHP 7.4.33 (cli) (built: Apr 26 2023 19:13:59) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.33, Copyright (c), by Zend Technologies

composerのplatformバージョン変更

% composer require php:"^7.4"
% composer install

lockファイルの差分を確認

確認項目

  • 新しい予約後をコード内で利用していないか
  • 互換性がない関数を利用していないか
  • 非推奨になったコードを利用していないか

アップデート後の機能を取り入れる

  • 変数に型付きプロパティ(Typed Property)を利用できる
  • 配列内での値のアンパック
mugi65mugi65

Laravel 6.xからLaravel 8.xへアップデート

実行しているプロジェクトのバージョンは 6.20.x であったため、 バージョン7, バージョン8の最新へと段階的にアップグレードしていく

Laravel Frameworkの公式ドキュメントのアップグレードガイドを参照する

手順

  • 6から7へアップグレードするための必要な依存パッケージを更新する
  • ビルドが失敗した箇所の修正を行う
  • ビルドが通過したら動作チェックを行う
  • 7から8へアップグレードするための必要な依存パッケージを更新する
  • ビルドが失敗した箇所の修正を行う
  • ビルドが通過したら動作チェックを行う
  • 完了

composer パッケージ更新

すべての依存パッケージを更新する

composer require --dev phpunit/phpunit:"^9.0" nunomaduro/collision:"^5.0" -W
composer require laravel/framework:"^8.0" laravel/ui:"^3.0" -W

パッケージ更新時の失敗の対応

パッケージ更新に失敗することがあるため、PHPやLaravelのアップデートを行い不要なパッケージを削除やバージョン指定なしで再度追加することで解決可能。

更新した際は、それぞれのパッケージに破壊的変更が含まれていないか確認する。

composer require bensampo/laravel-enum
composer require kreait/laravel-firebase

利用パッケージの警告

メンテナンスが行われていないプラグインの警告も出してくれるため確認

1 package suggestions were added by new dependencies, use `composer suggest` to see details.
Package fruitcake/laravel-cors is abandoned, you should avoid using it. No replacement was suggested.
Package swiftmailer/swiftmailer is abandoned, you should avoid using it. Use symfony/mailer instead.

laravel-corsはバージョン8まで対応。バージョン9以降はlaravel本体に組み込まれたようなので、次のアップグレード時にパッケージを削除する。
https://github.com/fruitcake/laravel-cors

備考

Laravel Support Policy に記載がある通り、 PHP 7.4 でサポートしているのは Laravel 8 までのため、Laravel 9以降は後続のPHPアップデートが必要となる