Laravelバージョンアップした件(5.5 → 6.0)

はじめに

Laravelのバージョンアップを初めて行ったので、記録しておきます。

最新は7系ではありますが、LTSということで6.Xとなりました。
※7/28時点のLaravel6の最新版は6.18.31

アップグレードガイド 6.x Laravel

言語やフレームワークのバージョンアップはやるだけならそんなに時間はかからないですが、 元のバージョンと同じ動作をしてくれるかの確認が一番大変です。

まぁ、先の事は置いといてまずはバージョアップですね。

compose update

ひとまず6.Xに上げてみる。

composer.jsonのバージョンを変更

"laravel/framework": "^6.0",
"php": "^7.2",
"fideloper/proxy": "^4.0",

最低限上記で足りるが、システムで使用しているライブラリによっては他もバージョンアップが必要。
私の場合だと以下でした。

"laracasts/utilities": "3.0", を "^3.0"に変更 (3.1に更新された)
"nwidart/laravel-modules": "^3.2", を ^6.0 に変更

compose updateでエラー発生

configureMonologUsingのエラー

> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover

Fatal error: Uncaught Error: Call to undefined method Illuminate\Foundation\Application::configureMonologUsing() in /var/www/project/bootstrap/app.php:29
Stack trace:
#0 /var/www/project/artisan(20): require_once()
#1 {main}
  thrown in /var/www/project/bootstrap/app.php on line 29
Script @php artisan package:discover handling the post-autoload-dump event returned with error code 255

Laravel5.6のアップデートの際に廃止になった模様

アップグレードガイド 5.6 Laravel

logging.phpに移行してあげないといけない。
ログの出力ファイル名が処理によって変えられるような独自のハンドラーの実装がされていたので、
それっぽいハンドラークラスを作って指定してあげないといけないぽい。
他のエラーもあるので一旦消して後回し。
ちなみにlogging.phpは新規で適当にLaravelプロジェクトを作成してコピって来ました。

'str*'、'array*'の修正

5.8で非推奨となり、6.0で削除となりました。
Str::、Arr::で置き換える。
確実に修正が必要なのは下記ファイル。
* config/cache.php * config/session.php 他は実装によりけりなので、strやarraygrepして書き換えていく。

str_slug を Str::slug に変更
str_random を Str::random に変更

AbstractRequestのメソッド可視化レベル変更

validationData()メソッドがprotectedからpublicに変更が必要なので、素直に変える。

上記までで、ひとまずcomposer updateを通過!

proxy headerの修正

とりあえず画面開いてみようとしたら出たエラー。
文字列での指定方法から変更があったらしい。
app/Http/Middleware/TrustProxies.php
特にデフォルトから変更はなさそうだったので、laravel6の新規プロジェクトから抽出して置き換え。

変更前
    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',
    ];

変更後
    protected $headers = Request::HEADER_X_FORWARDED_ALL;

codeseptionの修正

今度はテストコード実行でエラーに。
具体的にはAspectMockにてエラーが発生。
codeseptionのエラーログから、関連してそうなgoaop、codeceptionのバージョンアップを実施

"codeception/codeception": "~2.5.0",
"goaop/framework": "~2.2",

上記バージョンアップに伴い、codeceptionのgithubをみるに、
bootstrap.phpのinit定義にcacheDirの追加が必要らしい。
とりあえず/tmpでよいかな。
'cacheDir' => '/tmp',

画面開くも404エラー

これが一番しんどかった。
とあるアプリだけページが開けず404エラーが発生。
ログも出ないので、最初なぜエラーが発生するのかわからず。
リクエストが届いていないんじゃないか?
ということでルーティング周りを調べてたどり着いたのが以下。

laravel-moduleのmigrate

laravel-moduleなるものを使ってモジュールを機能で分けていたのですが、
これがうまく動いていない模様。

Laravelのバージョンによりlaravel-moduleもバージョン上げなければならず、 laravel-modulesは6.0以上を指定。公式READMEより。

しかし、これだけだと前述の404で動いてくれず、CHANGELOGに答えが。

laravel-modules/CHANGELOG.md at master · nWidart/laravel-modules · GitHub

php artisan module:v6:migrate

上記を実行し、ようやく画面が開いてくれました。

しかし、まだ終わりではなかった。。
のですが、力尽きたのでまた後日