Symfony 4 без пространства имен верхнего уровня - PullRequest
0 голосов
/ 26 апреля 2018

Я хочу перенести проект 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/"
    }
},
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...