【Laravel】クラスが見つからない時の対処法:Class not foundとdoes not comply with psr-4 autoloading standard. Skipping.

mark-between-man-and-woman Laravel
記事内に広告が含まれていることがあります。

Laravelでページを更新したときにクラスが見つからないというエラがー発生することがある。

そもそもクラスが存在していなければ、このエラーが表示されて当然だが、名前空間を指定したクラスがきちんと存在しているにも関わらず発生することがある。

この原因と対処法について。

Class ‘名前空間\クラス名’ not found

クラスが見つからない原因

対象の名前空間を指定したファイルが存在するのに、クラスが見つからない主な原因は、そのファイルがコンパイルされていないこと。

コンパイルがされていない原因は大きく2つ。

  1. コンパイルが走っていない。
  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には、名前空間とファイル名やファイルの置き場所の規則があり、それが間違っているとコンパイルエラーが発生する。

dump-autoloadのコンパイル失敗例

$ composer dump-autoload
Generating optimized autoload files

Class App\Services\JsonLd located in ./app/JsonLd.php does not comply with psr-4 autoloading standard. Skipping.

does not comply with psr-4 autoloading standard. Skipping. と表示され、コンパイルが失敗している。

名前空間とファイルの設置場所と名前

名前空間とクラスを定義したファイルをcomposer dump-autoloadするための命名規則は以下。

  1. 名前空間のパスとファイルのパスが一致する。
  2. ディレクトリ名とファイル名は大文字と小文字を区別する(名前空間と一致すること)

つまり、 「App\Services\JsonLd」という名前空間とクラスを定義した場合は、「app > Services > JsonLd.php」 というファイルがコンパイル対象となる

冒頭のAppディレクトリは名前空間では小文字「app」で問題ないが、その後の、「Services」と「JsonLd」は大文字・小文字を区別することに注意が必要。

名前空間とファイルの命名規則例2

例えば、以下のような、「name space App\Http\Controllers」の「Controller」クラスの場合は、

<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}

この内容を記述するファイルのパスとファイル名は以下でなければならない。

app > Http > Controllers > Controller.php

ファイルパスとファイル名を修正して、再度「composer dump-autload」を実行すれば、コンパイルが成功する。(does not comply with psr-4 autoloading standard. Skipping. が表示されなくなる)

そして、ページ読み込み時の「Class ‘名前空間\クラス名’ not found」のエラーが解消する。

タイトルとURLをコピーしました