Я хотел начать новый проект 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" ] }, ...