私のSymfonyプロジェクトでいくつかの共有クラスのカスタムディレクトリ構造をセットアップしようとしています。プロジェクトのルートにカスタムフォルダーを作成し、Symfonyの自動ロード機能を使用して、そのフォルダーからサービスを自動的に登録したいと考えています。
そこで、services.yamlファイルにカスタムサービスの名前空間を追加しました。
# src ./config/services.yaml
services:
...
TestNamespace\:
resource: '../TestNamespace/*'
...
そして、私はカスタムフォルダに空のクラスを追加しました:
# src ./TestNamespace/TestClass.php
namespace TestNamespace;
class TestClass
{
}
アプリを実行すると、次のエラーが発生します。
(1/2) InvalidArgumentException
Expected to find class "TestNamespace\TestClass" in file
"/path/to/ClassLoadErrorDemo/demo/TestNamespace/TestClass.php"
while importing services from resource
"../TestNamespace/*", but it was not found! Check the
namespace prefix used with the resource.
(2/2) FileLoaderLoadException
Expected to find class "TestNamespace\TestClass" in file
"/path/to/ClassLoadErrorDemo/demo/TestNamespace/TestClass.php" while
importing services from resource "../TestNamespace/*", but it was not
found! Check the namespace prefix used with the resource in
/path/to/ClassLoadErrorDemo/demo/config/services.yaml (which is loaded
in resource "/path/to/ClassLoadErrorDemo/demo/config/services.yaml").
パス、名前空間、クラス名を何度も再確認したところ、すべてが問題なく、エラーが発生する理由がわかりません。 ./srcフォルダー内のコントローラーは正常に読み込まれるようです。ここで何が悪いのですか?
問題を特定するためのデモリポジトリを作成しました。
git clone https://github.com/smoelker/SymfonyClassLoadErrorDemo.git
cd SymfonyClassLoadErrorDemo/demo
composer install
mv TestNamespace/TestClass.php_ TestNamespace/TestClass.php
php bin/console server:start
Composer.jsonオートロード設定を更新します
{
[...]
"autoload": {
"psr-4": {
"TestNamespace\\": "TestNamespace/",
"": "src/"
}
},
[...]
}
実行後:composer dump-autoload
そしてさらに試みる。
composer dump-autoload --classmap-authoritative
は、コマンドの実行時にsrc
ディレクトリが存在する場合にのみ機能します。
これは特に、通常はcomposer.json
/composer.lock
のみをビルドイメージにコピーする場合に、マルチステージDockerビルドで問題になる可能性があります。