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 сущности:
- Acme/AnotherBundle/Entity/Person
- AppBundle/Entity/Book
- 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?
Большое спасибо заранее за любые советы (и советы хорошей практики), чтобы решить это дело!:-)