Laravelをバージョン5.8から6.xへアップグレードする
Laravelをバージョン5.8から6.xへアップグレードします。
Laravel 5.8はPHP 7.1.3以上が必要ですが、昨今、PHP 7.1も非奨励となっています。
そこで、セキュリティ面も考慮して、PHP 7.2以上が動作条件となっているLSTのLaravel 6.xへアップグレードしようと思います。
今回は、基本的に公式マニュアルに沿って作業します。
アップグレードガイド 6.x Laravel
まず、composer.jsonをテキストで開きます。
"require": { "php": "^7.1.3", "laravel/framework": "5.8.*",
こちらを、以下のように書き換えます。
"require": { "php": "^7.2", "laravel/framework": "^6.0",
コマンドラインからcomposerでアップデートを実行します。
> composer update
しばらく待てば、アップグレード完了です。
あっさりですね。。あっさり過ぎる。。本当に大丈夫?w
いろいろなパッケージを追加で組み込んでいるケースでは、アップグレードが途中で停止して、composer.jsonを見直すといったことを繰り返すこともあるようですが、私の場合は一切なかったです。
とりあえずは問題なさそうですが、時間をかけてじっくり細かいところをチェックしたいと思います。
チェックポイント
アップグレード後、運用していると、細かいところで不具合などがちらほら出てきたので、その都度、こちらに追記していきます。
validationのjpgチェックがおかしい
まだ原因が特定できていませんが、validationのimageチェックで、jpg画像だけチェックをパスしなくなってしまいました。
以下、Laravel 5.8の時には問題なく動作していたチェック設定です。
'image' => 'required|file|image|mimes:jpg,jpeg,png,gif|max:10000',
これまでは指定したjpg画像リクエストをパスしていましたが、Laravel 6にアップグレードした後、いずれのjpgを登録してもエラーとなってしまい、validationを通過できなくなってしまいました。
'image' => 'required|file|mimes:jpg,jpeg,png,gif|max:10000',
このように、取り急ぎ「image」を外して対処しています。原因調査中です。
ユーザ新規登録時に本人確認メールが送信できない
ユーザ新規登録時に送信する本人確認メールを日本語化するためにオーバーライドしてたのですが、その処理に変更があったようで、6.xにアップグレードした時点で動作しなくなっていました。
以下「VerifyEmail.php」のオーバーライドした5.8の処理です。
protected function verificationUrl($notifiable) { return URL::temporarySignedRoute( 'verification.verify', Carbon::now()->addMinutes(60), [ 'id' => $notifiable->getKey() ] ); }
これが6.0の場合、パラメータhashを追加する必要があります。
protected function verificationUrl($notifiable) { return URL::temporarySignedRoute( 'verification.verify', Carbon::now()->addMinutes(60), [ 'id' => $notifiable->getKey(), 'hash' => sha1($notifiable->getEmailForVerification()) ] ); }
本人確認メールの送信がGETからPOSTへ変更
本人確認メールを送信するアクションが、5.8ではGETでしたが、6.xからPOSTに変更になりました。
つまり、5.8での実装では以下でしたが、
<a href="{{ route('verification.resend') }}">送信</a>
6.xでの実装は以下になります。
<form method="POST" action="{{ route('verification.resend') }}"> @csrf <button type="submit">送信</button> </form>
validationのjpgチェックがおかしい の件
ValidatesAttributes.php内のvalidateImageで、validateMimesのパラメータに「jpg」が含まれていないことが原因だと思います。
kzさんありがとうございます!
なるほど。Laravel 6.xから「jpg」が除外されたってことですかね。なぜだろう。。
調査・修正してみます!