#phpのautoloadでclassが読み込めない
新しいプロジェクトにアサインして、環境構築を行っていたとき、以下のようなエラーが出現。
Callable Myapp\Controller\Hogehoge does not exist
クラスがないというエラーと思いコンソールでもphpを直接実行。
PHP Fatal error: Uncaught Error: Class 'Myapp\Controller\Hogehoge' not found in var/www/html/index.php:4
やはりクラスが認識出来ずにエラーになっている。
エラーになっているクラスは、autoloadをcomposerで設定しているためcomposerのアップデートをかける。
// composer.json すべてのアップデート
$ composer update
// autoload 関連ファイルの更新のみ
$ composer dumpautoload
しかし状況は改善せず・・・
#composerの設定を確認
以下のコマンドでcomposerのロード先フォルダをダンプする。
$autoloader = require "vendor/autoload.php";
echo json_encode($autoloader->getPrefixesPsr4(), JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
exit;
実行すると以下のような結果となる。
{
"Myapp\\": [
"/var/www/html/vendor/composer/../../src/myapp"
]
}
上記が表示されていたら、composerの設定の更新は出来てそうだ。
スペルミス等の凡ミスは要チェック。
composerの設定は出来ていそうなので、autoloader側からクラスを使えるか確認。
$autoloader = require "vendor/autoload.php";
$result = $autoloader->findFile('Myapp\Controller\Hogehoge');
echo json_encode($result);
exit;
実行結果はfalse
本来は以下のような結果で取得できる。
\/var\/www\/html\/vendor\/composer\/..\/..\/src\/Myapp\/Controller\/Hogehoge.php"
最適化をcomposerに行って貰う
ここまで問題を切り分けたが解決できなかった場合は、composerに最適化を行ってもらう。(最終手段)
$ composer dump-autoload --optimize
とりあえず動作を確認できました。
参考サイト!!
Composerのautoloaderの最適化の仕様について - 開発ブログ
[PHP]ComposerでAutoload出来ない時の確認方法 - akamist blog
「Fatal error: Class ‘…’ not found」に陥ったときのチェック5項目 - Qiita