稼働中の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は見送りですかねぇ。