Как сгенерировать документ с помощью Symfony 3.4, используя Symfony flex
В Symfony flex одно из изменений заключается в том, что при использовании symfony/skeleton отсутствует пакет по умолчанию.
Я не нахожу способ использовать команду doctrine:mongodb:generate:documents в этом контексте.
Не могли бы вы сказать мне, как его использовать?
Exemple:
php bin\console doctrine:mongodb:generate:documents App
2018-02-17T18:35:22+00:00 [error] Error thrown while running command "doctrine:mongodb:generate:documents AppBundle --document Test". Message: "No bundle AppBundle was found."
In DoctrineODMCommand.php line 87:
No bundle AppBundle was found.
doctrine:mongodb:generate:documents [--document [DOCUMENT]] [--no-backup] [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [-e|--env ENV] [--no-debug] [--] <command> <bundle>
Вот как я настраиваю свой проект
composer create-project symfony/skeleton:3.4 test
composer config "platform.ext-mongo" "1.6.16" && composer require "alcaeus/mongo-php-adapter"
composer require doctrine/mongodb-odm-bundle
Спасибо
С Уважением,
Крис
2 ответа
Существует аналогичная проблема с доктриной и doctrine:generate:entities
, Команда Doctrine не рекомендует пользователям использовать эти команды и поэтому больше не хочет их обслуживать.
Я думаю, что самый простой обходной путь, который я видел до сих пор:
- Создайте приложение в стиле Symfony 3.3 с помощью установщика Symfony.
- Генерация сущностей в AppBundle, как вы делали раньше
- Изменить пространство имен с
AppBundle
вApp
, - Переместите файлы в свой проект Symfony 4.
Некоторые из команды Symfony также намеревались обеспечить похожую генерацию кода в MakerBundle. Насколько я могу судить, генерировать сущности в стиле ODM нечего, но вы можете открыть вопрос или внести что-то для этого самостоятельно.
Для справки: https://github.com/doctrine/DoctrineBundle/issues/729
MongoDBBundle требует, чтобы у вас был "Bundle", но с Symfony flex вы используете FrameworkBundle, а не "AppBundle", если вы не создали его раньше, я думаю, что вы его не создали, поэтому он говорит вам, что он не существует.
Вы не можете использовать "FrameworkBundle", потому что у FrameworkBundle есть другое пространство имен и другой базовый путь, поэтому команда для создания документов не знает, где находятся файлы.
После большого количества времени выяснения, как грязно-исправить это:
- Создайте собственный Bundle внутри вашего проекта (например, AppCoreBundle)
- Определите пользовательское сопоставление внутри пакетов /doctrine_mongodb.yaml (измените значение типа, если вы используете xml или yaml)
doctrine_mongodb:
auto_generate_proxy_classes: '%kernel.debug%'
auto_generate_hydrator_classes: '%kernel.debug%'
connections:
default:
server: '%env(MONGODB_URL)%'
options: {}
default_database: '%env(MONGODB_DB)%'
document_managers:
default:
auto_mapping: true
mappings:
AppCoreBundle:
is_bundle: true
type: annotation
dir: '/Document'
prefix: App\CoreBundle\Document
alias: AppCoreBundle
- Измените каталог "src" на "App", чтобы избежать проблем, затем обновите pmas-4 namaspace внутри composer.json:
"App\\": "App/"
- Переместите все документы в каталог документов пакета и измените имена пакетов.
- Вам также придется изменить ВСЕ ссылки на каталог "src" в вашем проекте, например, в services.yaml.
- Затем выполните:
rm -rf var/cache/* && composer install
заставить очистить кеш и ссылки. - Затем выполните:
php bin/console doctrine:mongodb:generate:documents AppCoreBundle
Важный! Это решение решает проблемы совместимости с MongoODMBundle с Symfony 4, но это не правильный путь. Правильное исправление включает в себя изменение поведения пакета или Symfony 4.