web-dev-qa-db-fra.com

Erreur Symfony4 lors du chargement du dossier personnalisé des classes "Il est prévu de trouver la classe ... mais elle n'a pas été trouvée"

Problème

J'essaie de configurer une structure de répertoires personnalisée pour certaines classes partagées dans mon projet Symfony. Je veux créer un dossier personnalisé à la racine de mon projet et je veux utiliser la fonction de chargement automatique de Symfony pour enregistrer automatiquement les services à partir de ce dossier.

J'ai donc ajouté un espace de noms de services personnalisé au fichier services.yaml:

# src ./config/services.yaml
services:
    ...

    TestNamespace\:
    resource: '../TestNamespace/*'

  ...

Et j'ai ajouté une classe vide dans le dossier personnalisé:

# src ./TestNamespace/TestClass.php

namespace TestNamespace;

class TestClass
{

}

Lorsque j'exécute l'application, j'obtiens l'erreur suivante:

(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").

J'ai revérifié les chemins, l'espace de noms et le nom de classe plusieurs fois et tout semble aller bien et je ne comprends pas pourquoi j'obtiens toujours l'erreur. Les contrôleurs du dossier ./src semblent se charger correctement. Qu'est-ce que je fais mal ici?

Étapes à reproduire

J'ai créé un dépôt de démonstration pour isoler le problème.

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

Mettez à jour votre configuration de chargement automatique composer.json

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

Après l'exécution: composer dump-autoload et essayez à nouveau.

20
albert

composer dump-autoload --classmap-authoritative ne fonctionnera que si votre répertoire src est présent au moment où vous exécutez la commande.

Cela peut être un problème avec les versions Docker en plusieurs étapes en particulier, lorsque vous copiez normalement le composer.json/composer.lock dans l'image de construction.

1
Ryan