Symfony3 ClassNotFoundException после создания пакета

Я хотел начать новый проект 3.3 в Symfony и начать, как обычно:

1.) Создание нового проекта: symfony new ArtProject

2.) Создание нового php app/console generate:bundle : php app/console generate:bundle (Paul / ArtBundle, yml, src /)

Затем я запускаю локальный сервер, и когда я открываю 127.0.0.1:8000, я получаю это красивое сообщение:

(1/1) КлассNotFoundException

Попытка загрузить класс «PaulArtBundle» из пространства имен «Paul \ ArtBundle». Вы забыли оператор «use» для другого пространства имен? в AppKernel.php (строка 19)

Что странно, и я не понял, почему это происходит до сих пор. Перед созданием Bundle ошибок не было; Я видел типичную стартовую страницу symfony.

 public function registerBundles() { $bundles = [ new Symfony\Bundle\FrameworkBundle\FrameworkBundle(), ...... new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(), new AppBundle\AppBundle(), new Paul\ArtBundle\PaulArtBundle(), ]; } 

 <?php namespace Paul\ArtBundle; use Symfony\Component\HttpKernel\Bundle\Bundle; class PaulArtBundle extends Bundle { } 

Любая идея, что там происходит? Я ничего не менял, я только управлял этими командами.

Я только что установил новую копию S3.3.4 (последняя версия на момент написания этой статьи), используя:

 composer create-project symfony/framework-standard-edition s334 "3.3.4" bin/console generate:bundle Share across multiple apps: yes namespace: Paul\ArtBundle bundle name: PaulArtBundle Target Directory: src/ 

Обновленный браузер и, конечно же, я получил сообщение класса не найденное.

Команда generate: bundle не обновляет раздел autload для composer.json, когда вводится новое пространство имен. Измените композитор.json и:

 # composer.json "autoload": { "psr-4": { "AppBundle\\": "src/AppBundle", "Paul\\": "src/Paul" }, "classmap": [ "app/AppKernel.php", "app/AppCache.php" ] }, 

Затем запустите

 composer dumpautoload 

И перезапустите сервер (возможно). Это должно устранить неполадку класса пакета.

Я не использовал команду generate: bundle довольно давно, поскольку стандарт должен был помещать все под AppBundle, поэтому я не знаю, как долго это было «сломано». Но по крайней мере три вопроса на прошлой неделе или около того указывают, что это было что-то недавнее.

И, кстати, когда я обновил браузер, я получил «Hello World», который бросил меня немного. Оказывается, новый пакет переопределяет маршрут /, который также является особым.

И если кто-то задается вопросом, почему это произошло, Symfony 3.2 изменилась с

 #composer.json "psr-4": { "": "src/" }, To "psr-4": { "AppBundle\\": "src/AppBundle" }, 

Вы всегда можете просто изменить его, хотя я думаю, что отдельные пространства имен могут быть «лучше». Не уверен.

И вот проблема с более подробной информацией: https://github.com/symfony/symfony-standard/issues/1098

Похоже, что сопровождающий предпочел небольшое улучшение скорости, нарушив существующую команду. Ну что ж. Symfony Flex, как предполагается, сделает все отлично.

Если вы создаете пакет для использования в нескольких проектах (с собственным пространством имен), вам необходимо добавить его в composer.json как указано:

Предположим, что ваше имя пакета – CompanyFooBundle с пространством имен Company\Bundle\FooBundle тогда раздел автозагрузки композитора должен выглядеть так:

 ... "autoload": { "psr-4": { "Company\\Bundle\\FooBundle\\": "src/Company/Bundle/FooBundle" }, "classmap": [ "app/AppKernel.php", "app/AppCache.php" ] }, ...