Laravelでページを更新したときにクラスが見つからないというエラがー発生することがある。
そもそもクラスが存在していなければ、このエラーが表示されて当然だが、名前空間を指定したクラスがきちんと存在しているにも関わらず発生することがある。
この原因と対処法について。
Class ‘名前空間\クラス名’ not found
クラスが見つからない原因
対象の名前空間を指定したファイルが存在するのに、クラスが見つからない主な原因は、そのファイルがコンパイルされていないこと。
コンパイルがされていない原因は大きく2つ。
- コンパイルが走っていない。
- 名前空間とファイル名の命名規則が間違っている。
それぞれの対処法は以下になる。
対処法
コンパイルが走っていない
クラス名を変更したり、新たにクラスを追加した時など、コンパイルが走っていない場合がある。その時は以下コマンドを実行する。
$ composer dump-autoload
これで、ファイルの変更内容が読み込まれ、適切にコンパイルし、クラスを生成してくれる。
Composerとは?
Composerとは、PHPのライブラリ管理ツール。いろんなライブラリの依存関係を解消してくれる。(Composerが必要なライブラリを自動で取ってきてくれる)
「composer install」や「composer update」を実行すれば、必要なライブラリをダウンロードしてくる。
composer dump-autoloadとは?
composer dump-autoloadは、同じくcomposerのコマンドだが、ライブラリをダウンロードすることはない。これは、プロジェクト内のクラスを再生成するコマンド。
名前空間とファイル名の命名規則が間違っている
ComposerはPSR-4というルールに従ってautoloadを実行する。
PSR-4には、名前空間とファイル名やファイルの置き場所の規則があり、それが間違っているとコンパイルエラーが発生する。
does not comply with psr-4 autoloading standard. Skipping. と表示され、コンパイルが失敗している。
名前空間とファイルの設置場所と名前
名前空間とクラスを定義したファイルをcomposer dump-autoloadするための命名規則は以下。
- 名前空間のパスとファイルのパスが一致する。
- ディレクトリ名とファイル名は大文字と小文字を区別する(名前空間と一致すること)
つまり、 「App\Services\JsonLd」という名前空間とクラスを定義した場合は、「app > Services > JsonLd.php」 というファイルがコンパイル対象となる。
冒頭のAppディレクトリは名前空間では小文字「app」で問題ないが、その後の、「Services」と「JsonLd」は大文字・小文字を区別することに注意が必要。
ファイルパスとファイル名を修正して、再度「composer dump-autload」を実行すれば、コンパイルが成功する。(does not comply with psr-4 autoloading standard. Skipping. が表示されなくなる)
そして、ページ読み込み時の「Class ‘名前空間\クラス名’ not found」のエラーが解消する。