Как использовать 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 (composer autoload) и мой автозагрузчик, он не будет работать, пока я не создам экземпляр класса в моем собственном автозагрузчике.

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/"         
    }
 }

или загрузите автозагрузчик composer в ваш 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

Другие вопросы по тегам