Как использовать Composer для автозагрузки классов извне поставщика?

Я использую автозагрузчик psr-4 от композитора:

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

Загружает классы из /var/www/html/xxx/vendor/yyy/src/DG/Munch

Но как я могу загружать классы из /var/www/html/xxx/?

Я написал свой автозагрузчик, но когда мне требуется vendor/autoload.php (автозагрузка композитора) и мой автозагрузчик, он не будет работать, пока я не создам экземпляр класса в моем собственном автозагрузчике.

Ответы

Ответ 1

Каталог src будет в корне вашего проекта. Он находится на том же уровне, что и каталог vendor.

Если вы определяете

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

это не будет загружать классы из /var/www/html/xxx/vendor/yyy/src/DG/Munch, как вы заявили.

Поскольку ваша структура проекта:

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

Пространство имен \DG\Munchkin будет отображаться в классах внутри

/var/www/html/xxx/src/DG/Munch и не внутри

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

Но как я могу загружать классы из /var/www/html/xxx/?

Определите пути в файле composer.json(внутри/var/www/html/xxx/) вашего проекта:

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

или загрузите автозагрузчик композитора в index.php или во время загрузки и добавьте пути вручную:

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

Ссылка: https://getcomposer.org/doc/04-schema.md#autoload