Как заставить Composer/PSR-4 принять мое второе пространство имен во вложенной папке?

#php #symfony #composer-php #psr-4

Вопрос:

Приведено приложение Symfony 4.4 (в частности, Sylius), использующее PSR-4 для автоматической загрузки:

     "autoload": {
        "psr-4": {
            "App\": "src/",
            "KYCBundle\": "src/KYCBundle/"
        }
    },
 

До сих пор размещение всех контроллеров и сущностей и так далее в src каталоге хорошо работает:

   src
  - Controllers
  - Entities
 

И соответствующее пространство имен, например,:

 namespace AppControllerAdmin;
 

Но для второго пространства KYCBundle имен это не работает.

   src
     KYCBundle
     - Controllers
     - Command
     - Entities
 

Когда я хочу использовать классы со следующим объявлением пространства имен:

 namespace KYCBundleCommandAccessTokenCommand
 

это приведет к ошибке:

Ожидается, что в файле будет найден класс «AppKYCBundleCommandAccessTokenCommand». /src/KYCBundle/Command/AccessTokenCommand.php» при импорте услуг с ресурса «../src/*», но он не был найден! Проверьте префикс пространства имен, используемый для ресурса.

Когда я меняю пространство имен с KYCBundleCommand на AppKYCBundleCommand думает, все работает хорошо. Кроме того, когда я удалю вторую строку в конфигурации PSR-4, все не изменится, что в основном означает, что с конфигурацией PSR-4 или без KYCBundle нее она вообще не используется.

Как разрешить мне использовать пространство KYCBundle имен в качестве корневого уровня без префикса App ?

Комментарии:

1. Настоящий виновник здесь-автопроволока. По умолчанию он сканирует каталог src и путается в нескольких пространствах имен. Исключите каталог src/KYCBundle или отключите автоматическое подключение, и эта конкретная ошибка исчезнет. Но лучше всего поступить так, как предложено ниже, и иметь только одно пространство имен для каждого каталога. Лично я бы создал каталог src-kyc, но фактическое имя не важно.

Ответ №1:

Не помещайте классы из вашего второго пространства имен внутрь src . Избегайте вложенных пространств имен «корни».

Либо поместите свое второе пространство имен снаружи src , например.:

 - ./src
- ./KYCBundle
 

Или имеют разные корни внутри src :

 - ./src/App
- ./src/KYCBundle
 

Логически, измените свой composer.json файл в соответствии со структурой каталогов.