web-dev-qa-db-fra.com

Comment utiliser Composer pour charger automatiquement des classes de l'extérieur du fournisseur?

J'utilise psr-4 chargeur automatique du compositeur:

"autoload": {
    "psr-4": {
        "DG\\Munchkin\\": "src/DG/Munch/"
    }
}

Cela charge les classes de /var/www/html/xxx/vendor/yyy/src/DG/Munch

Mais comment puis-je charger des classes à partir de /var/www/html/xxx/?

J'ai écrit mon propre chargeur automatique, mais quand j'ai besoin de vendor/autoload.php (composeur autoload) et mon autoloader, cela ne fonctionnera pas tant que je n'aurai pas créé d'instance d'une classe dans mon propre autoloader.

16
Tomasz Szymanek

Le répertoire src se trouverait à la racine de votre projet. C'est au même niveau que le répertoire vendor.

Si vous définissez

"autoload": {
    "psr-4": {
        "DG\\Munchkin\\": "src/DG/Munch/"
    }
}

cela ne chargera pas les classes de /var/www/html/xxx/vendor/yyy/src/DG/Munch, comme vous l'avez dit.

Parce que la structure de votre projet est:

/var/www/html/
 +- /xxx (project)
     - composer.json
     +- /src
        +- DG
           +- Munch
     +- /vendor
        - autoload.php
        +- vendor-projectA
        +- vendor-projectB
        +- yyy

Le \DG\Munchkin l'espace de noms serait mappé aux classes à l'intérieur

/var/www/html/xxx/src/DG/Munch et pas à l'intérieur

/var/www/html/xxx/vendor/yyy/src/DG/Munch.

Mais comment puis-je charger des classes depuis/var/www/html/xxx /?

Définissez les chemins dans le fichier composer.json (à l'intérieur/var/www/html/xxx /) de votre projet:

"autoload": {
    "psr-4": {
        "ProjectRoot\\" : "", 
        "NamspaceInSourceDir\\" : "src/"         
    }
 }

ou chargez l'autoloader composer dans votre index.php ou pendant c'est bootstrap et ajoutez les chemins manuellement:

$loader = require 'vendor/autoload.php';
$loader->add('Namespace\\Somewhere\\Else\\', __DIR__);
$loader->add('Namespace\\Somewhere\\Else2\\', '/var/www/html/xxx');

Référencement: https://getcomposer.org/doc/04-schema.md#autoload

33
Jens A. Koch