Symfony 3 — класс не был найден в цепочке сконфигурированных пространств имен при попытке построить связь между двумя объектами двух пакетов

Используя Symfony 3.4.2, я пытаюсь построить отношения между двумя объектами двух разных пакетов, которые используют свои собственные базы данных, расположенные на разных серверах.

Другими словами, у нас есть две базы данных, а затем два менеджера сущностей:

  • Одна существующая база данных MariaDB [person], в которой хранится одна таблица «person», используемая многими другими приложениями.
  • Одна новая база данных MariaDB [приложение], предназначенная для приложения.

Обратите внимание, что я не могу ничего изменить в этой ситуации (устаревшие приложения должны работать). Хотя в будущем планируется заменить базу данных [person] REST API.

Следуя документу Symfony (https://symfony.com/doc/3.4/doctrine/multiple_entity_managers.html), это дает следующий файл app/config/config.yml:

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: services.yml }

# Put parameters here that don't need to change on each machine where the app is deployed
# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
    locale: en

framework:
    #esi: ~
    #translator: { fallbacks: ['%locale%'] }
    secret: '%secret%'
    router:
        resource: '%kernel.project_dir%/app/config/routing.yml'
        strict_requirements: ~
    form: ~
    csrf_protection: ~
    validation: { enable_annotations: true }
    #serializer: { enable_annotations: true }
    default_locale: '%locale%'
    trusted_hosts: ~
    session:
        # https://symfony.com/doc/current/reference/configuration/framework.html#handler-id
        handler_id: session.handler.native_file
        save_path: '%kernel.project_dir%/var/sessions/%kernel.environment%'
    fragments: ~
    http_method_override: true
    assets: ~
    php_errors:
        log: true

# Twig Configuration
twig:
    debug: '%kernel.debug%'
    strict_variables: '%kernel.debug%'

# Doctrine Configuration
doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver: pdo_mysql
                host: '%database_host%'
                port: '%database_port%'
                dbname: '%database_name%'
                user: '%database_user%'
                password: '%database_password%'
                # charset: UTF8
                charset: utf8mb4
                default_table_options:
                    charset: utf8mb4
                    collate: utf8mb4_unicode_ci
                # if using pdo_sqlite as your database driver:
                #   1. add the path in parameters.yml
                #     e.g. database_path: '%kernel.project_dir%/var/data/data.sqlite'
                #   2. Uncomment database_path in parameters.yml.dist
                #   3. Uncomment next line:
                #path: '%database_path%'

            acme_another_db :
                driver: pdo_mysql
                host: '%acme_another_database_host%'
                port: '%acme_another_database_port%'
                dbname: '%acme_another_database_name%'
                user: '%acme_another_database_user%'
                password: '%acme_another_database_password%'
                # charset: UTF8
                charset: utf8mb4
                default_table_options:
                    charset: utf8mb4
                    collate: utf8mb4_unicode_ci
                # if using pdo_sqlite as your database driver:
                #   1. add the path in parameters.yml
                #     e.g. database_path: '%kernel.project_dir%/var/data/data.sqlite'
                #   2. Uncomment database_path in parameters.yml.dist
                #   3. Uncomment next line:
                #path: '%database_path%'

    orm:
        # Let's disable auto_mapping since we have several entity_managers
        # auto_mapping: true

        default_entity_manager: default
        entity_managers:
            default:
                naming_strategy: doctrine.orm.naming_strategy.underscore
                connection: default
                mappings:
                    AppBundle:  ~

            acme_another_em:
                naming_strategy: doctrine.orm.naming_strategy.underscore
                connection: acme_another_db
                mappings:
                    AcmeAnotherBundle: ~

        auto_generate_proxy_classes: '%kernel.debug%'

# Swiftmailer Configuration
swiftmailer:
    transport: '%mailer_transport%'
    host: '%mailer_host%'
    username: '%mailer_user%'
    password: '%mailer_password%'
    spool: { type: memory }

Поскольку таблица "person" будет использоваться многими другими приложениями, я решил создать отдельный пакет.

С точки зрения сущности, у меня есть 3 сущности:

  1. Acme/AnotherBundle/Entity/Person
  2. AppBundle/Сущность/Книга
  3. AppBundle/Сущность/BookInterest

Первая сущность была сгенерирована без ошибок.

Сущности AppBundle/Entity/Book и AppBundle/Entity/BookInterest были созданы с помощью bin\console generate:doctrine:entity без каких-либо проблем.

Перед обновлением схемы базы данных я добавил связь в файл класса сущности AppBundle/Entity/BookInterest (связь с Acme/AnotherBundle/Entity/Person и с AppBundle/Entity/Book), следуя документу Symfony (http://symfony.com/doc/3.4/doctrine/associations.html).

/**
 * @ORM\ManyToOne(targetEntity="Book", inversedBy="book")
 * @ORM\JoinColumn(name="fk_book_id", referencedColumnName="id", nullable=false)
 */
private $book;

/**
 * @ORM\ManyToOne(targetEntity="Acme\AnotherBundle\Entity\Person")
 * @ORM\JoinColumn(name="fk_person_id", nullable=false)
 */
private $person;

Но когда я пытаюсь обновить схему через bin\console doctrine:schema:update --force --em=default, у меня появляется следующее сообщение об ошибке:

В строке 37 MappingException.php: класс «Acme\AnotherBundle\Entity\Person» не найден в сконфигурированных пространствах имен AppBundle\Entity.

Добавление «использовать Acme\AnotherBundle\Entity\Person;» в самом верху \src\AppBundle\Entity\BookInterest.php и очистка кеша через bin\console cache:clear проблему не решает.

Я что-то пропустил в файле конфигурации app/config/config.yml или в файле класса сущности \src\AppBundle\Entity\BookInterest.php?

Doctrine2 не может справиться с одной связью между двумя менеджерами сущностей?

Я также нашел (довольно старое) сообщение о похожей проблеме (Использование отношений с несколькими менеджерами сущностей), что указывает на то, что Doctrine2 не может этого сделать (из-за использования двух менеджеров сущностей).

Если это все еще так, как лучше всего справиться с этой ситуацией?

Является ли хорошей практикой использование одного простого целочисленного поля без связи в AppBundle/Entity/BookInterest для хранения person_id и создания проверок проверки вручную (затем ручных запросов) в BookInterestController?

Заранее большое спасибо за любые советы (и советы по хорошей практике), чтобы решить этот случай! :-)


person Levure    schedule 18.12.2017    source источник
comment
Много слов. Я думаю, вы спрашиваете, может ли Doctrine связать две сущности с разными менеджерами сущностей? Если да, то нет.   -  person Cerad    schedule 18.12.2017