Composer2.0から気をつけるべきこと
完全に自分が悪いのですがComposer2.0からの仕様変更、自分のミスが重なり2時間ほど無駄な時間を過ごしたので原因、解決方法を共有しておきます。
結論
ファイル名・その中のクラス名は同じになるようにしよう!
状況
Laravelで簡単なアプリを作成していてコードも特に間違いがないはずなのになぜかエラーが出てしまう。それもfileのundifinedエラーでした。それも関数を書いているところのインターフェースが見つからないと言ったエラーなのですが、ファイルも存在していて構成も問題ないはず。キャッシュ削除も試しそれでも上手く動かず。エラー内容をコピペして調べてなんとなくcomposerを1系にダウングレードしたところ動くようになりました。
具体的なエラーを貼っておきます
// Composer ver2.0
Class App\Service\ScheduleServiceInterface located in
./app/Service/ScheduleInterface.php does not comply with
psr-4 autoloading standard. Skipping.
// Composer ver1.0
Class hogee located in ./hoge.php does not comply with psr-4 autoloading
standard. It will not autoload anymore in Composer v2.0. in...
原因
ポイントはdoes not comply with psr-4 autoloading standardこの箇所ですね。どうやらcomposer2.0からファイル名、その中のクラス名が異なっている場合無視されるみたいです。↑の例で言えばクラスはhogeeになっているもののファイル名はhoge.phpとなっていて異なっています。調べた感じ名前空間を意識した変更みたいです。もちろん hoge copy.php といったファイルも無視されます。
解決
自分のミスですがファイル名がScheduleInterface.phpとなっていてその中身でScheduleServiceInterfaceとして定義されていました。Serviceが抜けていたんですよね。原因がわかってもなおなかなか気づきませんでした。ファイル名、インターフェース名を ScheduleServiceInterface(.php) にと統一するとcomposer2.0でも動くようになりました。
ファイル名が間違えているのも意図的ではなかったが故になかなか気づかず原因の特定にかなり時間がかかりました。
この記事が気に入ったらサポートをしてみませんか?