Edited at

Laravel 5.5 から 5.8 にバージョンアップ

Laravel の 5.5 から Larave 5.8 にバージョンアップする手順です。同時に PHP 7.0 から 7.1 に更新します。新しいバージョンが出たら放置せずになるべく早く更新しましょう:sweat_smile:


更新後のバージョン


  • Laravel 5.8

  • PHP 7.1+

  • PHPUnit 7+

  • barryvdh/laravel-debugbar 3.2+

Laravel 5.8 は PHP 7.1 以降を要求するので事前にアップデートしておきましょう。PHPUnit も PHP 7.1 に対応するため 7 以降が必要になります。

Laravel DebugBar を使っているときは合わせてバージョンアップが必要です。


更新作業


  1. 事前準備

  2. Laravel のバージョンアップ

  3. PHPUnit のバージョンアップ

  4. DebugBar のインストール

  5. テストの実行


事前準備

テストがある場合は事前に実行してエラーが無いことを確認してください。アップデート後に再実行して影響がある箇所を特定します。

続いて PHP 7.1 以降をインストールします。phpenv を使うとかんたんにインストールできます。

DebugBar barryvdh/laravel-debugbar は Laravel アップデート時にエラーになるので composer.json から削除しておきます。config/app.php に ServiceProvider と Facade を登録している場合は一緒に削除してください。


Laravel のバージョンアップ

composer.json を開いて require の中から laravel/framework を探します。バージョンが 5.5 になっていたらひとつ次のバージョン 5.6 に変更して保存します。

保存したら composer update を実行してください。

エラーが出なければバージョンを 5.6 から 5.7 に変更して composer update を再実行します。これを 5.8 まで繰り返してください。


バージョンアップ中にエラーが出る場合

composer update を実行すると、パッケージのアップデート完了後に php artisan optimize が実行されます。optimize の実行中にエラーが発生してもパッケージのアップデートは完了しているので無視するか、エラーメッセージを参照して修正してください。


PHPUnit のバージョンアップ

Laravel のバージョンアップが完了したら PHPUnit のバージョンを更新してください。composer.jsonphpunit/phpunit~7.0 に変更して composer update を実行します。


Laravel DebugBar のインストール

削除した DebugBar を再インストールします。最新のバージョンを取得するため composer require --dev barryvdh/laravel-debugbar を実行します。


テストの実行

全ての更新が完了したらテストを再実行してください。発生したエラーと対処方法は以下のとおりです。


Dotenv の仕様変更


エラーメッセージ

PHP Fatal error:  Uncaught TypeError: Argument 1 passed to Dotenv\Dotenv::__construct() must be an instance of Dotenv\Loader, string given, called in /app/tests/autoload.php on line 8 and defined in /app/vendor/vlucas/phpdotenv/src/Dotenv.php:31


対応方法

Laravel で使用している Dotenv の初期方法が変わっています。独自に使っている場合は初期化メソッドを以下のように変更します。

// 旧

(new Dotenv\Dotenv(dirname(__DIR__), $filename))->load();
// 新
(\Dotenv\Dotenv::create(dirname(__DIR__), $filename))->load();


PHPUnit のメソッドシグネチャ変更


エラーメッセージ

PHP Fatal error:  Declaration of Tests\TestCase::setUp() must be compatible with Illuminate\Foundation\Testing\TestCase::setUp(): void in /app/tests/TestCase.php on line 17


対応方法

TestCase::setUp のメソッドシグネチャが変更されています。また PHP 7.1 に対応した戻り値の type hinting も追加されています。

テストクラスで setUp() をオーバーライドしている場合は新しいシグネチャに変更します。

// 旧 Laravel 5.5

public void setUp() {...}
// 新 Laravel 5.8
protected void setUp(): void {...}


互換性のない PHP 7.1 の変更


エラーメッセージ

Failed asserting that exception of type "ArgumentCountError" matches expected exception "\Exception". Message was: "Too few arguments to function App\Hoge::__construct(), 1 passed in /app/tests/Unit/App/HogeTest.php on line 112 and exactly 2 expected" at


対応方法

PHP 7.1 からユーザ定義関数の呼び出し引数が不足していると Error 例外がスローされるようになりました。テストを実行してエラーになる箇所があれば修正します。

その他の変更点は PHP: 下位互換性のない変更点 - Manual にまとめられています。


追記

Laravel 5.8 では新しい設定ファイルが追加されているので適当な場所に laravel new で新しいアプリケーションを作成してから config/* のファイルをコピーしてきましょう。

対象ファイル


  • config/logging.php