Как настроить Doctrine 2 с несколькими менеджерами сущностей в одном проекте? (без Symfony / Zend)

я использую Учение 2 (без Zend и Symfony) для доступа два разные Базы данных MySQL в мой проект.

Я пытался создать два EntityManager для каждой базы данных одна. Два загрузочные файлы настроены использовать свои собственные классы, которые расположены в ГРЦ-папка. Они есть обратный инжиниринг с «orm: convert-mapping —from-database» и «orm: generate-entity —generate-annotations = true» и подтверждено с помощью «orm: validate-schema».

Но загрузочные файлы использовать то же самое autoload.php Конфигурация, которая находится в продавец-папка, где композитор а также Учение 2 установлены.

composer.json файл находится в папке проекта.

В настоящее время только последняя сгенерированная схема «EntitiesAnlagenAnalyse» работает, в то время как первая сгенерированная схема «EntitiesPreisAnalyse» производит ошибка:

«Doctrine \ Common \ Persistence \ Mapping \ MappingException» с сообщением
«Класс« Артикель »не существует» в
ProjectDir \ поставщика \ доктриной \ Common \ Lib \ Doctrine \ Common \ Постоянство \ Mapping \ MappingException.php: 96

# 1 ProjectDir \ vendor \ doctrine \ common \ lib \ Doctrine \ Common \ Persistence \ Mapping \ RuntimeReflectionService.php (41):
Доктрина \ Common \ Постоянство \ Mapping \ MappingException :: nonExistingClass ( ‘Код’)

# 2 ProjectDir \ vendor \ doctrine \ common \ lib \ Doctrine \ Common \ Persistence \ Mapping \ AbstractClassMetadataFactory.php (281):
Доктрина \ Common \ Постоянство \ Mapping \ RuntimeReflectionService-> getParentClasses ( ‘Код’)

# 3 ProjectDir \ vendor \ doctrine \ common \ lib \ Doctrine \ Common \ Persistence \ Mapping \ AbstractClassMetadataFactory.php (311):
Доктрина \ Common \ Постоянство \ Mapping \ AbstractClassMetadataFactory-> getParentClasses ( ‘Код’)

# 4 ProjectDir \ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ Mapping \ ClassMetadataFactory.php (78):
Учение \ Общее \ П в
ProjectDir \ поставщика \ доктриной \ Common \ Lib \ Doctrine \ Common \ Постоянство \ Mapping \ MappingException.php
по линии 96


Изображение папки проекта

Для детального ознакомления с моей структурой проекта: картина иерархии



composer.json

{
"require": {
"doctrine/orm": "*"},
"autoload": {
"psr-0":
{
"": ["EntitiesAnlagenAnalyse/src/", "EntitiesPreisAnalyse/src/"]
}
}
}

EntitiesAnlagenAnalyse \ bootstrap.php

<?php
// bootstrap.php
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;

require_once(__DIR__."/../vendor/autoload.php");

// Create a simple "default" Doctrine ORM configuration for Annotations
$isDevMode = true;
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), $isDevMode, null, null, false);
$config->setProxyDir(__DIR__."/proxies");

// database configuration parameters
$conn = array(
'driver' => 'pdo_mysql',
'user' => '****',
'password' => '****',
'dbname' => '****',
);

// obtaining the entity manager
$AnlagenAnalyseManager = EntityManager::create($conn, $config);

EntitiesPreisAnalyse \ bootstrap.php

<?php
// bootstrap.php
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;

require_once(__DIR__."/../vendor/autoload.php");

// Create a simple "default" Doctrine ORM configuration for Annotations
$isDevMode = true;
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), $isDevMode, null, null, false);
$config->setProxyDir(__DIR__."/proxies");

// database configuration parameters
$conn = array(
'driver' => 'pdo_mysql',
'user' => '****',
'password' => '****',
'dbname' => '****',
);

// obtaining the entity manager
$PreisAnalyseManager = EntityManager::create($conn, $config);

Если я пытаюсь использовать второй EntityManager «PreisAnalyse» сейчас, кажется, что он использует отображение «EntitiesAnlagenAnalyse», потому что он пытается получить столбец «t0.bezeichnung», который находится только в классе «Artikel» в «EntitiesAnlagenAnalyse». Но он запрашивает правильную базу данных, где «bezeichnung» не существует.

ИНФОРМАЦИЯ: Некоторые классы имеют одинаковое имя в обоих менеджерах. Таким образом, в обоих EntitiyManager’ах есть таблица Artikel.

с сообщением «SQLSTATE [42S22]: столбец не найден: 1054 столбец неизвестен
‘t0.bezeichnung’ в ‘списке полей’ ‘в
ProjectDir \ поставщика \ доктрина \ DBAL \ Lib \ Doctrine \ DBAL \ Driver \ PDOConnection.php: 104

# 0
ProjectDir \ поставщика \ доктрина \ DBAL \ Lib \ Doctrine \ DBAL \ Driver \ PDOConnection.php (104):

PDO-> query (‘SELECT t0.artik …’)

# 1
ProjectDir \ поставщика \ доктриной \ DBAL \ Lib \ Doctrine \ DBAL \ connection.php (833):

Doctrine \ DBAL \ Driver \ PDOConnection-> query (‘SELECT t0.artik …’)

# 2
ProjectDir \ поставщика \ доктриной \ ORM \ Lib \ Doctrine \ ORM \ Persisters \ Entity \ BasicEntityPersister.php (884):

Doctrine \ DBAL \ Connection-> executeQuery (‘SELECT t0.artik …’, Array,
Array)

# 3
ProjectDir \ поставщика \ доктрина \ ORM \ Lib \ Doctrine \ ORM \ EntityRepository.php (181):

Учение \ ORM \ Persisters \ Entity \ BasicEntityPersister-> Loadall (Array,
NULL, NULL, NULL)

# 4
ProjectDir \ поставщика \ доктрина \ ORM \ Lib \ Doctrine \ ORM \ EntityRepository.php (164):

Doctrine \ ORM \ EntityRepository- в ProjectDir \ vendor \ doctrine \ dbal \ lib \ Doctrine \ DBAL \ Driver \ AbstractMySQLDriver.php
по линии 71


Теперь я попытался переключить строки в массиве автозагрузчика PSR-0, и он работает для «PreisAnalyseManager» и «AnlagenAnalyseManger», но только до тех пор, пока не достигнет запроса с классом «Artikel». Так что это определенно проблема с автозагрузчиком, и новый вопрос:

Как я могу определить пространства имен в автозагрузчике, чтобы доктрина правильно использовала его?

compose.json

{
"require": {
"doctrine/orm": "*"},
"autoload": {
"psr-0":
{
"": ["EntitiesPreisAnalyse/src/", "EntitiesAnlagenAnalyse/src/"]
}
}
}

3

Решение

решение должен был использовать PSR-4 автопогрузчик вместо из PSR-0 и как Садок-е сказал в комментариях ниже моего вопроса, я добавил конкретные пространства имен и, наконец, пришел к этому composer.json:

{
"require": {
"doctrine/orm": "*"},
"autoload": {
"psr-4":
{
"Preis\\": "EntitiesPreisAnalyse/src/",
"Anlagen\\": "EntitiesAnlagenAnalyse/src/"}
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]