Laravel の LTS のアップグレード(5.5->6.x)を細かくみてみる

## 概要
Laravel の LTS が ```5.5``` から ```6``` に上がったので、既存の Laravel5.5 アプリケーションをアップグレードしたところ、これホントに6？と思ったので、詳しく見てみた。
先に結論としては、だいたい```6```だけど```6```じゃない。です。

## 検証環境
- MBP 13-inch, 2017
- macOS Mojave v10.14.6
- PHP version: 7.3.11
- Composer version: 1.9.1

2019年11月7日に実行

## 手順
1. ```5.5```と```6```をそれぞれ用意する
2. ```5.5```に修正を加え```6```にアップグレードする
3. ```5.5```から```6```にアップグレードしたものと、```6```を比較する


## 1. ```5.5```と```6```をそれぞれ用意する
Composer で ```5.5```と```6```を用意する。

```
$ composer create-project --prefer-dist laravel/laravel 5.5 "5.5.*"
$ composer create-project --prefer-dist laravel/laravel 6
```

こんな感じ

```
.
├── 5.5     # 5.5 の初期状態を 6 にアップグレードする
└── 6       # 6 の初期状態
```

## 2. ```5.5```に修正を加え```6```にアップグレードする
まずは ```composer.json``` を更新する。laravel のバージョンと、PHP のバージョンを上げる必要があります。```5.5``` と ```6``` の ```composer.json``` を比較すると記述する順番が変わっていたりしますが、大差ないので、今回は```6```のものをだいたい正として変更します。

変更内容はこんな感じ（~, ^ の違いは省略）

```5.5/composer.json
...
    "require": {
-        "php": ">=7.0.0",
+        "php": "^7.2",
-        "fideloper/proxy": "~3.3",
+        "fideloper/proxy": "^4.0",
-        "laravel/framework": "5.5.*",
+        "laravel/framework": "^6.2",
         "laravel/tinker": "^1.0"
    },
    "require-dev": {
        "filp/whoops": "~2.0",
+       "facade/ignition": "^1.4"
        "fzaninotto/faker": "^1.4",
        "mockery/mockery": "^1.0",
+       "nunomaduro/collision": "^3.0",
-       "phpunit/phpunit": "~6.0",
+       "phpunit/phpunit": "^8.0",
        "symfony/thanks": "^1.0"
    },
...
    "scripts": {
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
-            "@php artisan key:generate"
+            "@php artisan key:generate --ansi"
        ],
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
-            "@php artisan package:discover"
+            "@php artisan package:discover --ansi"
        ]
    },
...
```

公式ドキュメントには、laravel のバージョンは、```^6.0```と書くようにとありましたが、本日 composer install すると```^6.2```となっていました。ま、どちらでも良いので気にしないことにします。

準備完了な気がしますが、このままだと ```composer update``` できないので、以下3ファイルを修正します。


```5.5/config/app.php
    'aliases' => [
...
+        'Arr' => Illuminate\Support\Arr::class,
+        'Str' => Illuminate\Support\Str::class,
...
```

```5.5-6/config/cache.php
<?php

+ use Illuminate\Support\Str;
...
    'prefix' => env(
        'CACHE_PREFIX',
-        str_slug(env('APP_NAME', 'laravel'), '_').'_cache'
+        Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'
    ),
```

```5.5/config/session.php
<?php

+ use Illuminate\Support\Str;
...
    'cookie' => env(
        'SESSION_COOKIE',
-        str_slug(env('APP_NAME', 'laravel'), '_').'_session'
+        Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
    ),
...
```
この状態で、```composer update``` すると、```5.5``` だったものが、```6```系に上がり、いちおう動くようになります。

## 3. ```5.5```から```6```にアップグレードしたものと、```6```を比較する
差分を取ってみます。ファイルレベルでどの程度違いがあるのかを見てみます。```vendor``` や関係なさそうなものは除外すると、以下のようになります。本当は、```composer update```で変更されるのは、```vendor```なので、前述の準備をする必要はないんですが、いったん、6系にアップグレードしたつもりになっている状態と6系の違いを見ているということで。
AMD は ```5.5 -> 6``` から```6```に対して見た状況です。

```
M       .env
M       .env.example
M       app/Http/Kernel.php
D       app/Http/Middleware/CheckForMaintenanceMode.php
M       app/Http/Middleware/TrustProxies.php
M       app/Http/Middleware/VerifyCsrfToken.php
M       app/Providers/AuthServiceProvider.php
M       app/Providers/EventServiceProvider.php
M       bootstrap/app.php
M       composer.json
M       config/app.php
M       config/auth.php
M       config/broadcasting.php
M       config/cache.php
M       config/database.php
M       config/filesystems.php
D       config/hashing.php
D       config/logging.php
M       config/mail.php
M       config/queue.php
M       config/services.php
M       config/session.php
M       config/view.php
M       package.json
M       phpunit.xml
D       resources/js/app.js
D       resources/js/bootstrap.js
M       resources/lang/en/passwords.php
M       resources/lang/en/validation.php
D       resources/sass/app.scss
M       tests/CreatesApplication.php
M       webpack.mix.js
```

詳細をここに書いていくのはしんどいので、以下を参照してください。

> [Comparison between Laravel 6 from 5.5 and Laravel 6 - Light](https://github.com/kurab/laravel-lts-upgrade/pull/4/files)

各バージョンでの変更の詳細は、Upgrade Guide などに任せます。（なんでLTS 間での Upgrade Guide ってないんですかね。）

> - [Upgrading To 5.6.0 From 5.5 / Upgrading To 5.6.30 From 5.6](https://laravel.com/docs/5.6/upgrade)
- [Upgrading To 5.7.0 From 5.6](https://laravel.com/docs/5.7/upgrade)
- [Upgrading To 5.8.0 From 5.7](https://laravel.com/docs/5.8/upgrade)
- [Upgrading To 6.0 From 5.8](https://laravel.com/docs/6.x/upgrade)

これらが、ファイルの差を生み出しているはず。


## 簡単に結論
ちょっと疲れちゃったので、簡単に結論書いて終わります。
ざっくりどんな感じかと言うと、```5.5```以降に実装され、```6```系に踏襲された新機能が有効になっていない状態？のようです。（ちゃんと調べてないので、いい加減なこと言ってるかも知れません。いずれ訂正するかも知れませんが、”な感じ”です。）

例えば、Log をどうこうしたいみたいな時に、Laravel 6 のドキュメントを読むと ```config/logging.php``` をいじって…となりますが、

**そんなファイルない！！相変わらず ```config/app.php``` の中でやってる！！！**

みたいなことが起こります。将来的に、```5.5``` から ```6``` に上げたという背景を知らない人が開発したときに、問題起こりそうですね。

という訳で、**お前のそれは Laravel 6 になってない！**

じゃあどうすんの？というのは、また今度。