Laravelを最新のバージョンに更新するタイミングは難しい。しかし、5.7,5.8などのメージャーバージョンが更新された直後に更新するのは避けた方が良いです。なぜなら、新バージョン直後は必ずいくつか予想できない問題が出てきて、その修正がマイナーバージョンアップとして暫く続くからです。しかし、ある程度時間が経過して落ち着いたバージョンをインストールしても、やはり予想できない問題が出てきてます。

例えば、私の大きなプロジェクトでは、その複雑さゆえに、必ず毎日storage/logs/laravel.logの中身をクロンで私宛にメールして、エラーが出ていないかチェックしています。そのメールで6月に入ってからいきなり毎日報告されてきたのが以下のようなエラー。

[2019-06-07 00:40:22] production.ERROR: Invalid method override "__CONSTRUCT". {"exception":"[object] (Symfony\\Component\\HttpFoundation\\Exception\\SuspiciousOperationException(code: 0): Invalid method override \"__CONSTRUCT\". at /vol1/usr/www/example/ec/vendor/symfony/http-foundation/Request.php:1244)
[stacktrace]
#0 /vol1/usr/www/example/ec/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php(159): Symfony\\Component\\HttpFoundation\\Request->getMethod()
...

ウェブログを調査すると、以下のようなログで、とても虚弱性を狙うためのスキャンくさい。

47.106.182.80 - - [06/Jun/2019:11:22:45 +0900] "POST /index.php?s=captcha HTTP/1.1" 500 1695 "http://xx.xx.xx.xx/index.php?s=captcha" "Go-http-client/1.1

しかし、それ同様な情報をサイトにPOSTしてもエラーとはならなく、不思議と思っていました。ほとんど毎日エラーとなっているので、Googleで調べてみましたが情報はなし。SuspiciousOperationExceptionとあるので、app/Exception/Handler.phpで対応すればいいのかな、くらいに考えていました。

その矢先に、購読しているLaravel Newsにおいて、以下が掲載されていました。

そう、SuspiciousOperationExceptionがらみの変更があったようです。そのリンクは、PR(pull request)で、読んでみると。

ふむふむ。PR作成した人は、どうも私と同じ状況のようで、Symphonyの更新がこのエラーの登場となったようです。そうそうLaravelSymphonyをベースとしているの思い出しました。

このPRでは、以前のように500でなく404(ページーがないエラー)で返す変更の提案でした。しかし、Laravelの作者であるTaylorくんが、「そう固定してしまうのは自由がなくなり困るケースが出てくるのでは?」と変更に反対の発言をし、開発者の采配にゆだねる方向に進み始めます。

しかし、違うひとが登場してきて、毎回この500エラーをslackやemailで報告されるのは嫌であるし、それを防ぐためにどのプロジェクトでもそのException をキャッチするのも面倒なのでデフォルトで404エラーとすべきだと発言。つまり最初に提案したPRの変更の方がいいと。

そして最終的には、そちらがベターということで、5.8.24での変更(修正ではなく)として5.8にマージされることになります。 そう大げさな変更でないですが、開発者として私もバージョンを更新するだけで私のプログラムをいちいち変更しないのは良いことと思います。

今回のことで、以前はchangelogは細かすぎて無視してきたけれど、意外とコードの変更の決断などが理解できて面白いと思った次第です。

By khino