2017-01-21 5 views
2

新しいクラスを追加するたびにオートローダをダンプする必要があります。私はpsr-4を使用しています。なぜ私はそうする必要があるのか​​分かりません。 psr-4では、クラスを自動的にロードするはずです。どこが間違っていますか?新しいクラスを追加するたびにオートロードをダンプする必要があります

は、ここに私のcomposer.jsonファイルが

{"autoload": {"psr-4": {"MyDomain\\": "app"}}} 

だ。ここに私のディレクトリ構造です:

enter image description here

は、ここに私のクラスのいずれかのコードです:(

<?php 

namespace MyDomain\Model; 

class Employee { 

} 
?> 
+0

どのオペレーティングシステムですか? – axiac

+0

私はUbuntuを使用しています。16.04 –

+0

'composer dump-autoload'を実行した後、クラスを見つけてロードしますか?奇妙な...彼らを見つけるべきではない。あなたは、偶然、 '作者dump-autoload -o'を実行しますか? – axiac

答えて

3

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.jsonapp/)で宣言されたディレクトリをスキャンし、見つけることができるすべてのクラスを含むクラスマップを作成するように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を実行して速度を少し向上させることができます。それぞれのデプロイ後にもう一度実行することを忘れないでください(または、デプロイメントスクリプトにコマンドを含めることをお勧めします)。

+0

非常に明確で正確な答えをいただきありがとうございます。 –

関連する問題