Я хочу перенести проект Silex в Symfony 4. Сначала я работаю над скелетом, поэтому я выполнил:
composer create-project symfony/skeleton myProject
, а затем требуются связки с composer require bundle
для каждого.
Один из них требует установки некоторой конфигурации, поэтому я добавил файл config/packages/custom_bundle.yaml
с такой конфигурацией.
custom_bundle.yaml
нужна пользовательская служба провайдера, которую я скопировал из проекта Silex в то же пространство имен (Security
) с тем же именем (UserProvider.php
), поэтому я создал службу на config/services.yaml
:
security.users_provider:
class: Security\UserProvider
Затем я попытался снова потребовать пакет и получаю эту ошибку:
Ожидается, что автозагрузчик класса "App \ Security \ UserProvider" будет определен в файле "/vagrant/myProject/vendor/composer/../../src/Security/UserProvider.php".
Файл был найден, но класс не был в нем, имя класса или пространство имен, вероятно, содержит опечатку в /vagrant/myProject/config/services.yaml (который загружается в ресурс "/vagrant/myProject/config/services.yaml" ).
Конечно, я должен сказать композитору загружать классы из пространства имен не верхнего уровня, поэтому я заменил:
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
в composer.json
с:
"autoload": {
"psr-4": {
"": "src/"
}
},
Но теперь я получаю эту ошибку, потому что пространство имен Kernel.php
равно App
:
Неустранимая ошибка PHP: Uncaught Symfony \ Component \ Debug \ Exception \ ClassNotFoundException: Попытка загрузить класс "Ядро" из пространства имен "App".
У меня есть весь проект Silex без пространства имен верхнего уровня, поэтому добавление App
или чего-либо еще в качестве пространства имен верхнего уровня будет означать переименование всех классов проекта.
С другой стороны, удаление пространства имен App
Kernel.php
будет означать использование этого класса в качестве глобального, что может быть не очень хорошей идеей.
Есть ли способ избежать переписывания всех пространств имен классов?
PS: я тоже пробовал с:
"autoload": {
"psr-4": {
"App\\": "src/",
"": "src/",
}
},
но то же самое происходит.
Edit:
Проблема заключалась в определении служб по умолчанию:
App\:
resource: '../src/*'
exclude: '../src/{Entity,Migrations,Tests,Kernel.php}'
Поскольку у меня нет пространства имен App
, я должен был это прокомментировать. Позже мне придется добавить любые сервисы, которые будут автоматически определены с их пространствами имен. Э.Г.
Service\:
resource: '../src/Service/*'
Так что он работает с комментированием определения служб приложений по умолчанию и добавлением:
"autoload": {
"psr-4": {
"App\\": "src/",
"Secutiry\\": "src/Secutiry/",
}
},
и любые другие пространства имен до composer.json
. Спасибо @Cerad за советы.
Edit2:
Даже работает с:
"autoload": {
"psr-4": {
"App\\": "src/",
"": "src/"
}
},