PSR-4とまたPSR-0)は、クラスClassName
は、ClassName.php
というファイルに格納されています。名前は大文字と小文字が区別され、正確に一致する必要があります。
プロジェクト内のファイル名は小文字で、クラス名は大文字と小文字が区別されます。 WindowsとMacOSのデフォルトのディスクフォーマットは、検索で大文字と小文字を区別しません。これは、プログラムがEmployee.php
を検索し、そのディレクトリにファイルemployee.php
が存在する場合、検索は成功し、OSは、その名前の大文字と小文字が同じでない場合でも、既存のファイルを返します。 LinuxベースのOSでは、デフォルトのディスクフォーマットでは大文字と小文字が区別され、Employee.php
を検索するプログラムではemployee.php
が見つかりません。
あなたcomposer.json
ファイルがPSR-4
標準を次のMyDomain
、名前空間のルートディレクトリとしてapp/
ディレクトリを宣言します。これは、MyDomain\Models\Employee
クラスをロードする必要があるときに、オートローダーがファイルapp/Models/Employee.php
を見つけるのに十分です。
Ubuntu(LinuxベースのOS)上で実行するため、PHPはEmployee.php
ファイルを読み込めません(存在しないため)。employee.php
の代わりにOSにファイルがありません。
composer update -o
またはcomposer dump-autoload -o
を使用してオートローダを生成しているようです。 -o
(短くは--classmap-authoritative
)は、あなたのケースでcomposer.json
(app/
)で宣言されたディレクトリをスキャンし、見つけることができるすべてのクラスを含むクラスマップを作成するようにComposerに指示します。クラスマップはクラス名(名前空間付き)をファイル名(ディレクトリ付き)にマップするリストです。このように、オートローダは各クラスをどこに見つけるか正確に知っていて、読み込みはより速くなります。
上記の2つの段落は、新しいクラスを追加した後にオートローダーを再生成する必要がある理由を説明しています。
ジョブを実行する正しい方法は、PSR-4
の要件に従うことです。具体的には、MyDomain
の各ネームスペースは、大文字小文字を含めて同じ名前のサブディレクトリapp/
に格納する必要があります。各クラスは、クラスと同じ名前(ケースを含む)と終端.php
(小文字)を持つファイルの適切なサブディレクトリに格納する必要があります。たとえば、クラスMyDomain\Models\Employee
はファイルapp/Models/Employee.php
にとどまる必要があります。
ファイル名を修正した後、composer dump-autoload
を実行して忘れてしまいます。クラス名とファイル名がPSR-4に従う限り、オートローダはPSR-4を再生成せずに見つけます。
プロダクションサーバでは、composer dump-autoload -o
を実行して速度を少し向上させることができます。それぞれのデプロイ後にもう一度実行することを忘れないでください(または、デプロイメントスクリプトにコマンドを含めることをお勧めします)。
どのオペレーティングシステムですか? – axiac
私はUbuntuを使用しています。16.04 –
'composer dump-autoload'を実行した後、クラスを見つけてロードしますか?奇妙な...彼らを見つけるべきではない。あなたは、偶然、 '作者dump-autoload -o'を実行しますか? – axiac