web-dev-qa-db-ja.com

Symfony4がクラスのカスタムフォルダーをロード中にエラーが発生しました "クラスの検索が必要ですが、見つかりませんでした"

問題

私の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
13
Sil

Composer.jsonオートロード設定を更新します

{
    [...]
    "autoload": {
        "psr-4": {
            "TestNamespace\\": "TestNamespace/",
            "": "src/"
        }
    },
    [...]
}

実行後:composer dump-autoload そしてさらに試みる。

20
albert

composer dump-autoload --classmap-authoritativeは、コマンドの実行時にsrcディレクトリが存在する場合にのみ機能します。

これは特に、通常はcomposer.json/composer.lockのみをビルドイメージにコピーする場合に、マルチステージDockerビルドで問題になる可能性があります。

1
Ryan