Edited at

laravel5.4で古いコントローラーが参照されてしまう現象


現象

SampleController.phpというファイルを参照して欲しいのに、同ディレクトリ内のSampleController_20181111.phpというバックアップのためにとっておいた古いファイルを参照してしまっていました。

ステージング環境で起きた現象なのですが、ローカル環境で変更した内容をステージング環境へ適用する前に、ステージング環境にあるSampleController.phpをバックアップとしてSampleController_20181111.phpにリネームしておき、git pullSampleController.phpを持ってきたという状況です。

するとステージング環境での動きがおかしく、どうも変更した内容が反映されていないっぽいということに気付き(これに気付くまでも時間がかかりました…)、SampleController_20181111.phpを削除してSampleController.phpのみの状態にしたのですが、SampleController_20181111.phpというファイルがありませんみたいなエラーになって、なんでそっち参照しようとするの?ってなりました。


原因

キャッシュされている…っぽい?

けどよくわからないです…


コメントしていただいたのですが、実ファイルを変更しても/vendor/composer/autoload_classmap.phpが変更されてないとダメで、その不整合をcomposer dump-autoloadで書き直してくれるということらしいです。

それが今回の原因っぽいです。


対応

とりあえずphp artisan optimizeをしたら正しいファイルを読み込んでくれました。

※コメントしていただいたのですが、php artisan optimizeはversionによって何をやっているかが全然違うみたいなので注意です。

その後ネットで調べていて、composer clear-cachecomposer dump-autoloadで解決できるらしいです。私はまだ試していないですが。

参考1:Laravel 5.4 using old controller in controllers directory

参考2:Laravel ClassLoader trying to load an old version of my model

1年以上同じ環境でやっていて今までもバックアップファイル作ったりしていたけれど、初めてのことだったので戸惑いました…。