#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
файл в соответствии со структурой каталогов.