Доктрина умножает менеджеров сущностей на создание данных - PullRequest
0 голосов
/ 03 июня 2019

Я настроил 2 EntityManager в своем проекте (по умолчанию em2).Похоже, ошибки не появлялись, но, хотя я указал папку для разделения сущностей, связанных с каждым EntityManager, Doctrine продолжает создавать таблицы, связанные с em2, в базе данных по умолчанию (в настоящее время используется doctrine:schema:update, как в тяжелой разработке).время).Что мне не хватает?Я также пытался создать команду, используя опцию --em, но она по-прежнему имеет то же нежелательное поведение.

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                # configure these for your database server
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4
                default_table_options:
                    charset: utf8mb4
                    collate: utf8mb4_unicode_ci

                url: '%env(resolve:DATABASE_URL)%'
            em2:
                # configure these for your database server
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4
                default_table_options:
                    charset: utf8mb4
                    collate: utf8mb4_unicode_ci
                schema_filter: ~^(?!m_sqlviewstate)~

                url: '%env(resolve:DATABASE_EM2_URL)%'
    orm:
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                #                auto_generate_proxy_classes: true
                naming_strategy: doctrine.orm.naming_strategy.underscore
                auto_mapping: false
                mappings:
                    App:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity'
                        prefix: 'App\Entity'
                        alias: App
            em2:
                connection: em2
                naming_strategy: doctrine.orm.naming_strategy.underscore
                mappings:
                    Em2:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Em2'
                        prefix: 'App\Entity\Em2'
                        alias: Em2

EDIT : я пытался удалить объекты em2 из Entity папка.Похоже, это сработало в отношении генерации таблиц, то есть у меня больше нет таблиц, генерируемых сущностями em2, в базе данных по умолчанию.

Однако теперь я получаю сообщение об ошибке в отношении сущностей связки.

Класс 'App \ Entity \ Shop \ User' не найден в пространствах имен, сконфигурированных для цепочки Lch \ MenuBundle \ Entity

AFAIK, похоже, это изДело в том, что мне нужно было бы вручную зарегистрировать каждый пакет dir / namespace по умолчанию EntityManager.Я не понимаю почему, потому что значение по умолчанию помечено как auto_mapping:

Ниже измененной части для orm:

    orm:
    default_entity_manager: default
    entity_managers:
        default:
            connection: default
            naming_strategy: doctrine.orm.naming_strategy.underscore
            auto_mapping: true
        em2:
            connection: em2
            naming_strategy: doctrine.orm.naming_strategy.underscore
            mappings:
                Em2:
                    is_bundle: false
                    type: annotation
                    dir: '%kernel.project_dir%/src/Em2Entity'
                    prefix: 'App\Em2Entity'
                    alias: Em2

1 Ответ

0 голосов
/ 03 июня 2019

По умолчанию Doctrine в Symfony загружает все сопоставления, которые он может захватить, в местах по умолчанию (например, src/Entity).Вы должны отключить это.

doctrine:
    orm:
        auto_mapping: false

Функция автоматического отображения Doctrine загружает конфигурацию аннотаций из каталога Entity / каждого пакета и ищет другие форматы (например, YAML, XML) в Resources / config /.каталог доктрины.

https://symfony.com/doc/master/reference/configuration/doctrine.html#custom-mapping-entities-in-a-bundle

А также ваша Entity/Em2 является подпапкой Entity, что означает, что сначала EntityManager будет загружать все объекты во всех подпапках.Переместите его на отдельный путь.

doctrine:
    orm:
        em2:
            mappings:
                Em2:
                    dir: '%kernel.project_dir%/src/EntityEm2'
...