さっきまで快適に作業してたのに、ちょっとファイルいじったら Class not found になったんです!
というときの対処方法です。
基本のチェック
まずは以下の記事からの抜粋です。
vendor/autoload.phpをrequireしているか?
「さっきまで動いてたんです 」 → 該当せず
composer.jsonにautoloadの定義を忘れていないか?
「さっきまで動いてたんです 」 → 該当せず
vendor/composer/autoload_*.phpの内容が最新になっているか?
以下のコマンドを実行……
$ composer dump-autoload
……解決せず
スペルミスは無いか?
「クラス名変えてません 」 → 該当せず
いま作業しているディレクトリは実行環境のものか?
「さすがに大丈夫っす 」 → 該当せず
さらなるチェック
さらに以下の記事からの抜粋です。
PSR-4 のパスが正しいか?
以下のコマンドを実行……
$ php -r '$a=require "vendor/autoload.php";echo json_encode($a->getPrefixesPsr4(), JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);'
……該当ネームスペースのパスは正しい → 該当せず
autloaderが正しいファイルを見つけられているか?
以下のコマンドを実行……
$ php -r '$a=require "vendor/autoload.php";echo json_encode($a->findFile("App\\Application"));'
"App\\Application"
のところは、あなたの見つからないクラス名に書き換えてください。
……出力されたパスは正しい → 該当せず
Composerにパッケージの最適化をしてもらう
これをすると、PSR-4 非準拠のディレクトリ階層でも、クラスを見つけてくれるようになるそうです。
以下のコマンドを実行……
$ composer dump-autoload --optimize
Generating optimized autoload files
Class App\Appelication located in ./src/Application.php does not comply with psr-4 autoloading standard. Skipping.
Generated optimized autoload files containing 3808 classes
……んん
Class App\Appelication located in ./src/Application.php does not comply with psr-4 autoloading standard. Skipping.
これ なに
名前空間とディレクトリ階層がマッチしているか?
PSR-4のことはよくわかりませんが、名前空間とディレクトリ階層がマッチしている必要があるそうです。
composer.json に次のように定義されていたとき
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
App\Controller\MyController
クラスを置く場所は
OKパターン | NGパターン | |
---|---|---|
クラスを置く場所 | src/Controller |
src/Controller 以外 |
となります。
……なんですけれど、これは該当しないですね。
基本に戻ってチェック!
納得いかない問題のとき、えてして原因は単純なものなのです。
いま作業しているディレクトリは実行環境のものか?
大丈夫!autoloaderが出力するパスも期待通り!
スペルミスは無いか?
git diff
してみました……
-class Application extends BaseApplication
+class Appelication extends BaseApplication implements AuthenticationServiceProviderInterface
……んん
いつの間にか指が滑っていたようです