Подтвердить что ты не робот

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

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

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

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

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

(1/1) ClassNotFoundException

Попытка загрузить класс "PaulArtBundle" из пространства имен "Павел\ArtBundle". Вы забыли "использование" для другого Пространство имен? в 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
{
}

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

4b9b3361

Ответ 1

Я только что установил новую копию 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, как предполагается, сделает все отлично снова.

Ответ 2

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

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

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