Laravel6.xからLaravel8.xへアップグレード

## まえがき

6.xがLTSだし6.xで開発しはじめていたが、ローンチ時期的に次のLTSバージョンが出る、もしくは近いことが想定されるのでいっそ次にバージョンを上げる際のコストを下げようの気持ちで8.xまでアップグレードするよ

## アップデート前情報

### PHP

```
PHP 7.4.3 (cli) (built: Feb 20 2020 21:53:46) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies
    with Xdebug v2.9.6, Copyright (c) 2002-2020, by Derick Rethans
```

### Laravel

```
Laravel Framework 6.18.35
```

### composer.json

- 実際に利用しているPJなのでアップデートとかには関係ないライブラリもあります

```json
    "require": {
        "php": "^7.4",
        "ext-fileinfo": "*",
        "ext-json": "*",
        "ext-pdo": "*",
        "ext-redis": "*",
        "aws/aws-sdk-php-laravel": "~3.0",
        "encore/laravel-admin": "^1.8",
        "fideloper/proxy": "^4.0",
        "guzzlehttp/guzzle": "^7.0",
        "lampager/lampager": "^0.4.0",
        "lampager/lampager-laravel": "^0.4.5",
        "laravel/framework": "^6.2",
        "laravel/tinker": "^2.0",
        "lcobucci/jwt": "^3.3",
        "vinkla/hashids": "^7.0"
    },
    "require-dev": {
        "barryvdh/laravel-ide-helper": "^2.6",
        "brianium/paratest": "^4.2",
        "deployer/deployer": "^6.8",
        "deployer/recipes": "^6.2",
        "facade/ignition": "^1.4",
        "friendsofphp/php-cs-fixer": "^2.16",
        "fzaninotto/faker": "^1.9.1",
        "laravel/telescope": "^3.2",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^3.0",
        "phpmd/phpmd": "^2.9",
        "phpunit/phpunit": "^9.0",
        "squizlabs/php_codesniffer": "^3.5"
    }
```

## 変更していく

下記のドキュメントを参考にしながら行っていく

- 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

### PHP要件

今回はもともとPHP7.4だったので特に変更無し

### Laravel依存パッケージのアップデート

#### 6 to 7 

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


#### 7 to 8

>
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へ

#### 変更したcomposer.json

- laravelの依存ライブラリ以外にも対応が必要な場合もあるのでPJごとによしなに

```diff
    "require": {
        "php": "^7.4",
        "ext-fileinfo": "*",
        "ext-json": "*",
        "ext-pdo": "*",
        "ext-redis": "*",
        "aws/aws-sdk-php-laravel": "~3.0",
        "encore/laravel-admin": "^1.8",
        "fideloper/proxy": "^4.0",
-       "guzzlehttp/guzzle": "^7.0",
+       "guzzlehttp/guzzle": "^7.0.1",
        "lampager/lampager": "^0.4.0",
        "lampager/lampager-laravel": "^0.4.5",
-       "laravel/framework": "^6.2",
+       "laravel/framework": "^8.0",
        "laravel/tinker": "^2.0",
+       "laravel/ui": "^3.0",
        "lcobucci/jwt": "^3.3",
-       "vinkla/hashids": "^7.0"
+       "vinkla/hashids": "^9.0"
    },
    "require-dev": {
        "barryvdh/laravel-ide-helper": "^2.6",
-       "brianium/paratest": "^6.0",
+       "brianium/paratest": "^6.8",
        "deployer/deployer": "^6.8",
        "deployer/recipes": "^6.2",
-       "facade/ignition": "^1.4",
+       "facade/ignition": "^2.3.6",
        "friendsofphp/php-cs-fixer": "^2.16",
        "fzaninotto/faker": "^1.9.1",
-       "laravel/telescope": "^3.2",
+       "laravel/telescope": "^4.0",
        "mockery/mockery": "^1.0",
-       "nunomaduro/collision": "^3.0",
+       "nunomaduro/collision": "^5.0",
        "phpmd/phpmd": "^2.9",
        "phpunit/phpunit": "^9.0",
        "squizlabs/php_codesniffer": "^3.5"
    }
```

このまま `compose update` すると最後のコマンド実行でエラーになるので先にSynfony5対応を行ってしまう

```
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 255
```

### Symfony5へのアップグレード

#### App\Exceptions\Handlerの変更

- `app/Exceptions/Handler.php` を8.xの内容でコピーする
- 見た感じ継承して親の処理呼んでただけの部分が消えた
  - 残したければ `Exception` を受けてるところを `Throwable` へ
- 自前実装分があればよしなに

https://github.com/laravel/laravel/blob/8.x/app/Exceptions/Handler.php

#### セッションの設定を変更

- `config/session.php` を8.xの内容でコピーする
- コメント以外は下記のような違いになっている
- 自前実装分があればよしなに

```diff:app\config\session.php
~~

- 'secure' => env('SESSION_SECURE_COOKIE', false),
+ 'secure' => env('SESSION_SECURE_COOKIE'),

~~

- 'same_site' => null,
+ 'same_site' => 'lax',

];
```

https://github.com/laravel/laravel/blob/8.x/config/session.php

### compose updateの実行

上記の対応まで行ってからcomposer updateを行い、エラーが出なければOK
エラーが出た場合は内容見て解決するのが良いとは思います

ここまでで最低限の対応

```sh
$ composer update
```

気になればキャッシュも消しておく

```sh 
$ artisan optimize:clear
```

### 更新後バージョン

```
Laravel Framework 8.16.1
```

### Next step

PJというか環境によっては上記までの対応では不足しているので動作確認をしながら、エラーや挙動がおかしい箇所に関してアップグレードガイドを参考にしていく

特に「影響の可能性： 高い」の部分は要チェック

- 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

参考までに、「影響の可能性: 低い」とされていても 自分のPJでは `$model->getOriginal` を利用していたので対応が必要になったり、 app/Providers/RouteServiceProvider.php をごにょごにょしていたので変更が必要だったり

ライブラリを更新した影響でLaravelと関係ないところで更新を迫られたりとまぁちょいちょいありました

アップグレードガイド見るよりコード差分見て行くほうが早いかもしれない
https://github.com/laravel/laravel/compare/6.x...8.x