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/Entity/Book
  3. AppBundle/Entity/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?

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

0 ответов

Другие вопросы по тегам