Laravelアップデート（5.5→6.0）でなかなか脳死作業になれなかった話

# 概要
Laravelのアップデートでガイド通りやれば脳死で作業できるだろうと思ってたら、すんなりアップデートできなくてハマりました。
共有知へお役に立てればと思い、手順等々を残します。
記述の仕方や内容等、至らない点があればご指摘を頂けますと嬉しいです。
# 環境
- 開発
    - Laravel : 5.5.49
    - PHP : 7.3.25
    - OS : Win10(Xampp)
- 本番
    - Laravel : 5.5.49
    - PHP : 7.3.23
    - OS : Amazon Linux AMI release 2018.03

# やったこと
まずは下記のガイドに従って、composer.jsonの `laravel/framework` を `^6.0` に書き換えて `composer update` を実行！
https://readouble.com/laravel/6.x/ja/upgrade.html

```json:composer.json
    "require": {
        "php": ">=7.0.0",
        "barryvdh/laravel-dompdf": "^0.8.6",
        "bensampo/laravel-enum": "^1.17",
        "doctrine/dbal": "^2.9",
        "fideloper/proxy": "~3.3",
        "guzzlehttp/guzzle": "^6.3",
        "laravel/framework": "5.5.*", //「5.5.*」→「^6.0」に変更
        "laravel/tinker": "~1.0",
        "laravelcollective/html": "5.5",
        "maatwebsite/excel": "^3.1",
        "nesbot/carbon": "1.26.0",
        "phpoffice/phpspreadsheet": "^1.6"
    },
```
結果

```
  Problem 1
    - laravel/framework v6.9.0 requires nesbot/carbon ^2.0 -> satisfiable by nesbot/carbon[2.0.0, 2.0.0-beta.1, 2.0.0-beta.2, 2.0.0-beta.3, 2.0.0-beta.4, 2.0.0-beta.5, 2.0.0-beta.6, 2.0.1, 2.1.0, 2.1.1, 2.10.0, 2.10.1, 2.11.0, 2.12.0, 2.13.0, 2.14.0, 2.14.1, 2.14.2, 2.15.0, 2.16.0, 2.16.1, 2.16.2, 2.16.3, 2.17.0, 2.17.1, 2.18.0, 2.19.0, 2.19.1, 2.19.2, 2.2.0, 2.2.1, 2.20.0, 2.21.0, 2.21.1, 2.21.2, 2.21.3, 2.22.0, 2.22.0-beta.1, 2.22.0-beta.2, 2.22.0-beta.3, 2.22.1, 2.22.2, 2.22.3, 2.23.0, 2.23.0-beta.1, 2.23.0-beta.2, 2.23.0-beta.3, 2.23.0-beta.4, 2.23.1, 2.24.0, 2.24.0-beta.1, 2.24.0-beta.2, 2.24.0-beta.3, 2.24.0-beta.4, 2.25.0, 2.25.0-beta.1, 2.25.0-beta.2, 2.25.0-beta.3, 2.25.1, 2.25.2, 2.25.3, 2.26.0, 2.27.0, 2.28.0, 2.28.0-beta.1, 2.29.0, 2.29.1, 2.3.0, 2.3.1, 2.30.0, 2.31.0, 2.32.0, 2.32.1, 2.32.2, 2.33.0, 2.34.0, 2.34.1, 2.34.2, 2.35.0, 2.36.0, 2.36.1, 2.37.0, 2.38.0, 2.39.0, 2.39.1, 2.39.2, 2.4.0, 2.4.1, 2.40.0, 2.40.1, 2.41.0, 2.41.1, 2.41.2, 2.41.3, 2.41.4, 2.41.5, 2.42.0, 2.43.0, 2.44.0, 2.45.0, 2.45.1, 2.46.0, 2.5.0, 2.5.1, 2.5.2, 2.5.3, 2.5.4, 2.6.0, 2.6.1, 2.7.0, 2.8.0, 2.9.0, 2.9.1, 2.x-dev] but these conflict with your requirements or minimum-stability.
```

「carbonが古ぃよks」と怒られているので、 `1.26.0` を `^2.0` に書き換えて、再度 `composer update` を実行！

結果

```
  Problem 1
    - laravelcollective/html v5.5 requires illuminate/view 5.5.* -> satisfiable by laravel/framework[v5.5.49], illuminate/view[v5.5.0, v5.5.16, v5.5.17, v5.5.2, v5.5.28, v5.5.33, v5.5.34, v5.5.35, v5.5.36, v5.5.37, v5.5.39, v5.5.40, v5.5.41, v5.5.43, v5.5.44].
```

サーセン。ここも5.5のままじゃダメっすよね、ということで `laravelcollective/html` の `5.5` を `^6.0` に書き換えて、再度 `composer update` を実行！

結果

```
  Problem 1
    - laravel/framework v5.5.49 requires nesbot/carbon ^1.26.0 -> satisfiable by nesbot/carbon[1.26.0, 1.26.1, 1.26.2, 1.26.3, 1.26.4, 1.26.5, 1.26.6, 1.27.0, 1.28.0, 1.29.0, 1.29.1, 1.29.2, 
1.30.0, 1.31.0, 1.31.1, 1.32.0, 1.33.0, 1.34.0, 1.34.1, 1.34.2, 1.34.3, 1.34.4, 1.35.0, 1.35.1, 1.36.0, 1.36.1, 1.36.2, 1.37.0, 1.37.1, 1.38.0, 1.38.1, 1.38.2, 1.38.3, 1.38.4, 1.39.0, 1.39.1] but these conflict with your requirements or minimum-stability.
    - Conclusion: remove fideloper/proxy 3.3.4
    - Conclusion: don't install fideloper/proxy 3.3.4
・・・
```

「fideloper/proxy」・・・ナニモンや（　＾ω＾）わからないことはGoogle先生に聞こう。
すると、こちらのスライドの1文に類似のエラーで引っかかっていた事例を挙げてくださっていました。（感謝）
https://www.slideshare.net/ohashiyuta/laravel55647

併せて下記の一文
>Laravelのリポジトリのcomposer.jsonを見に行く

なるほど、本家のcomposer.json見れば大いに参考になりそうですね。ということで、見に行きます。
https://github.com/laravel/laravel/blob/6.x/composer.json

```json:composer.json（本家）
    "require": {
        "php": "^7.2.5|^8.0",
        "fideloper/proxy": "^4.4",
        "laravel/framework": "^6.20",
        "laravel/tinker": "^2.5"
    },
```

OK、わかった、 `^4.4` だな。
ということで、 `fideloper/proxy` を `^4.4` に（ついでにPHPとtinkerも）書き換えて、再度 `composer update` を実行！
ちなみに、この時点での`composer.json`はこんな感じ↓

```json:composer.json
    "require": {
        "php": "^7.2.5", //「>=7.0.0」→「^4.4」に変更
        "barryvdh/laravel-dompdf": "^0.8.6",
        "bensampo/laravel-enum": "^1.17",
        "doctrine/dbal": "^2.9",
        "fideloper/proxy": "^4.4", //「~3.3」→「^4.4」に変更
        "guzzlehttp/guzzle": "^6.3",
        "laravel/framework": "^6.0", //「5.5.*」→「^6.0」に変更
        "laravel/tinker": "^2.5", //「~1.0」→「^4.4」に変更
        "laravelcollective/html": "^6.0", //「5.5」→「^6.0」に変更
        "maatwebsite/excel": "^3.1",
        "nesbot/carbon": "^2.0", //「1.26.0」→「^2.0」に変更
        "phpoffice/phpspreadsheet": "^1.6"
    },
```

結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180309/e4b0feb8-d55f-fd51-d5f5-f17dcac67d6f.png)
よっしゃ！見慣れたライブラリアップデートのlogが出てきた！後は動確して終わりや♪なーんて思ってたら、

```
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover

In cache.php line 91:

  Call to undefined function str_slug()  
```

これはGoogle先生に聞くとすぐに出てきます。アップグレードガイド内で該当するところは下記です。
https://laravel.com/docs/6.x/upgrade#helpers
>All str_ and array_ helpers have been moved to the new laravel/helpers Composer package and removed from the framework. If desired, you may update all calls to these helpers to use the Illuminate\Support\Str and Illuminate\Support\Arr classes. Alternatively, you can add the new laravel/helpers package to your application to continue using these helpers:

「ヘルパー関数が別パッケージに移動したのでcomposerでインストールしろ」とのことで、composerでインストールします。

```
composer require laravel/helpers
```

よっしゃ！composer完走！！動確やでー、ということで`http://localhost`へアクセスしたら、、、

```
Argument 2 passed to Symfony\Component\HttpFoundation\Request::setTrustedProxies() must be of the type int, array given, called in C:\sites\example.com\htdocs\vendor\fideloper\proxy\src\TrustProxies.php on line 54
```

もはや脳死作業では全然ないなと唇を噛みしめながらGoogle先生に問いかけます。
これも同様のエラーで引っかかっていた事例を挙げてくださっていました。（感謝）
ミドルウェアの特定クラスに変更があったようで、メンバ変数を配列型→String型に書き換えが必要とのこと。
https://qiita.com/pickles/items/924a97018c3a161a0170

ちなみにアップグレードガイドだと下記の場所です。（Trusted Proxiesのトコ）
https://laravel.com/docs/5.6/upgrade 

>Due to underlying changes in the trusted proxy functionality of Symfony HttpFoundation, slight changes must be made to your application's App\Http\Middleware\TrustProxies middleware.
The \$headers property, which was previously an array, is now a bit property that accepts several different values. For example, to trust all forwarded headers, you may update your $headers property to the following value:

本家レポジトリの該当クラスを見るとこんな感じでした。これに倣って該当クラスを修正します。
https://github.com/laravel/laravel/blob/6.x/app/Http/Middleware/TrustProxies.php

```app\Http\Middleware\TrustProxies.php
<?php

namespace App\Http\Middleware;

use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;

class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array
     */
    protected $proxies;

    // /**
    //  * The current proxy header mappings.
    //  *
    //  * @var array
    //  */
    // protected $headers = [
    //     Request::HEADER_FORWARDED => 'FORWARDED',
    //     Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
    //     Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
    //     Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
    //     Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
    // ];
    /**
     * The headers that should be used to detect proxies.
     *
     * @var int
     */
    protected $headers = Request::HEADER_X_FORWARDED_ALL;
}
```

ここまで対応してようやく想定していた画面が立ち上がりました。
Laravelのバージョンも確認しておきます。

```
# php artisan -v
Laravel Framework 6.20.25
```

（2021-04-30追記）

よくよくlogファイルを見てみたら下記のエラーが出ていました。

```
laravel.EMERGENCY: Unable to create configured logger. Using emergency logger. {"exception":"[object] (InvalidArgumentException(code: 0): Log [] is not defined.
```

loggingの設定がapp.phpからlogging.phpに外出しにされた為、該当ファイルが必要なようです。
本家リポジトリから該当ファイルを拾ってきます。併せてapp.phpのloggingの部分は削除しておきます。
https://github.com/laravel/laravel/blob/6.x/config/logging.php


# 補足（ここからは該当処理を取り入れている方向け）
## Slack通知処理
Slackへの通知処理を入れている方は下記も対応が必要です。
通知時にこんなエラーが表示されます。

```
InvalidArgumentException
Driver [slack] not supported.
```

アップグレードガイド内で該当するところは下記です。
https://laravel.com/docs/5.8/upgrade#notifications
>The Nexmo and Slack Notification channels have been extracted into first-party packages. To use these channels in your application, require the following packages:

「Slack通知関連ライブラリが別パッケージに移動したのでcomposerでインストールしろ」とのことで、composerでインストールします。

```
composer require laravel/slack-notification-channel
```

## PDF内の画像表示処理 ※PDF関係なさげでした。
私の場合はPDFに画像表示している箇所があり`画像が表示されなくなる`といった症状が発生しました。
ちなみにPDF出力には下記のライブラリを使用しています。
https://github.com/barryvdh/laravel-dompdf

原因はwidth属性／height属性への`%指定`でした。
調べてみると、HTML5ではwidth属性での%指定は廃止されているとのことで。。。PDFは関係なさげです。
CSSの方は使えそうだったのですが、100%指定は表示されるものの従来の比率%を指定したところ表示がされなかった為、
突き止められないところが悔しいですがstyle属性で`px指定`に書き直しました。
たまたま、PDF内の画像のみ%指定していただけだったので、画面上でも同様の指定の場合は表示されていなかったのかもしれません。

ちなみに修正方法は↓です。


```sample_pdf_template.blade.php

<img src="{{ asset('/img/company_seal.jpg') }}" width="11%" height="11%">
↓
<img src="{{ asset('/img/company_seal.jpg') }}" style="width: 100px;height: 100px;">
```

今まで表示できていたのも不思議ですが、HTML5では廃止されている背景を踏まえて、
Laravel側のテンプレートエンジンもHTML5に準拠するような修正が入ったのかもしれません。（あくまで推測）

# 総評
以上、脳死ではなかなかたどり着けない作業内容でしたが、Laravel6へのアップグレード部分はほぼガイド通りでした。
他の部分（私の場合はSlack通知やPDF上での画像表示etc）の部分で少し骨が折れました。

# （追記）
- （2021-05-06）logging.phpに関連した部分を追記

# 参考（公式アップグレードガイド）
https://laravel.com/docs/5.6/upgrade
https://laravel.com/docs/5.7/upgrade
https://laravel.com/docs/5.8/upgrade
https://laravel.com/docs/6.x/upgrade