2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-04-30

概要

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

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/html5.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

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はこんな感じ↓

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
よっしゃ!見慣れたライブラリアップデートの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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?