それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

laravel 5/6/7アプリケーションをphp8.0で動かす。

稼働中のLaravelアプリをバージョンアップ

php8で動かしたいと思ったけど、エラーになるので、対応する。

マニュアルupgrade 5.8 to 6を参考にアップグレードする

composer.json

## require 
-        "php": "^7.1",
+        "php": "^7|^8.0",
-        "laravel/framework": "5.8.*",
+        "laravel/framework": "^6",
-        "laravel/socialite": "^4.1",
+        "laravel/socialite": "^5",
## require-dev
-        "phpunit/phpunit": "^7.5"
+        "phpunit/phpunit": "^8.1"
composer update 

6.x を7.x にアップグレード

マニュアル( Upgrading To 7.0 From 6.x ) を参考にアップグレードする。

composer.json

-        "laravel/framework": "^6.*",
-        "laravel/socialite": "^4.1",
-        "laravel/tinker": "^1.0",
+        "laravel/framework": "^7",
+        "laravel/socialite": "^5",
+        "laravel/tinker": "^2.0",
+        "laravel/ui": "^2.5",
## require-dev
-        "phpunit/phpunit": "^8.1"
+        "phpunit/phpunit": "^8.3"
-        "fzaninotto/faker": "^1.4",
+        "fakerphp/faker": "^1.23",
-        "nunomaduro/collision": "^3.0",
+        "nunomaduro/collision": "^4.0",
composer update 

app/Exceptions/Handler.php がエラーになる。

PHP Fatal error:  Declaration of App\Exceptions\Handler::report(Exception $exception) 
must be compatible with Illuminate\Foundation\Exceptions\Handler::report(Throwable $e) in 

ここではExceptionで書かれている箇所をThrowable に変えてやる。

@@ -3,6 +3,7 @@
 namespace App\Exceptions;

 use Exception;
+use Throwable;
 use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

 class Handler extends ExceptionHandler
@@ -29,10 +30,10 @@ class Handler extends ExceptionHandler
     /**
      * Report or log an exception.
      *
-     * @param  \Exception  $exception
+     * @param  \Throwable  $exception
      * @return void
      */
-    public function report(Exception $exception)
+    public function report(Throwable $exception)
     {
         parent::report($exception);
     }
@@ -41,10 +42,10 @@ class Handler extends ExceptionHandler
      * Render an exception into an HTTP response.
      *
      * @param  \Illuminate\Http\Request  $request
-     * @param  \Exception  $exception
+     * @param  \Throwable  $exception
      * @return \Illuminate\Http\Response
      */
-    public function render($request, Exception $exception)
+    public function render($request, Throwable $exception)
     {
         return parent::render($request, $exception);
     }

追加パッケージのアップグレードの方法

依存関係のバージョンを把握するのがめんどくさいので、一回削除してから追加し直すと良い。

どれが、laravel が要求する composer.json で、どれが自分が書いた composer require かがわからなくなるよね。なので、Laravel関連と、Laravelのプラグインと、自分のアプリでパッケージと、区別してどれがどのRequireになるのか、開発時にメモを残しておいてほしい。でなければアップグレードが煩雑になる。

## 例
composer remove "barryvdh/laravel-ide-helper"
composer require "barryvdh/laravel-ide-helper"

laravel/ui が 7.0から出現するので、Auth::XXXが使われてる場合は、次のようにする。

## Auth:: を使っていた場合
composer require "laravel/ui"

php8.1 にすると

 Illuminate\Support\Collection::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset)

LaravelのCollectionというコアなパッケージがphp8.1のoffsetExists の引数(型指定)と合わないので非常にめんどくさい。これは致命的なので、互換モードがちゃんと実装されるまで、php8.1は見送りですかねぇ。