Как настроить Doctrine 2 с несколькими менеджерами сущностей в одном проекте? (без Symfony/Zend)
Текущая ситуация
Я использую Doctrine 2 (без Zend и Symfony) для доступа к двум различным базам данных MySQL в моем проекте.
Я попытался создать два EntityManager для каждой базы данных по одному. Два файла начальной загрузки настроены на использование своих собственных классов, которые расположены в папках src. Они подвергаются обратному проектированию с помощью "orm:convert-mapping --from-database" и "orm:generate-entity --generate-annotations=true" и проверяются с помощью "orm:validate-schema".
Но файлы начальной загрузки используют ту же конфигурацию autoload.php, которая находится в папке vendor, где установлены composer и Doctrine 2.
Файл composer.json находится в папке проекта.
В настоящее время работает только последняя сгенерированная схема EntitiesAnlagenAnalyse, а первая сгенерированная схема EntitiesPreisAnalyse выдает ошибку:
Неустранимая ошибка PHP: необработанное исключение
"Doctrine\Common\Persistence\Mapping\MappingException" с сообщением "Класс Artikel" не существует "в ProjectDir\vendor\doctrine\common\lib\Doctrine\Common\Persistence\Mapping\MappingException.php:96
Трассировки стека:
# 1 ProjectDir \ vendor \ doctrine \ common \ lib \ Doctrine \ Common \ Persistence \ Mapping \ RuntimeReflectionService.php (41): Doctrine\Common\Persistence\Mapping\MappingException:: nonExistingClass ('Artikel')
# 2 ProjectDir \ vendor \ doctrine \ common \ lib \ Doctrine \ Common \ Persistence \ Mapping \ AbstractClassMetadataFactory.php (281): Doctrine \ Common \ Persistence \ Mapping \ RuntimeReflectionService-> getParentClasses ('Artikel')
# 3 ProjectDir \ vendor \ doctrine \ common \ lib \ Doctrine \ Common \ Persistence \ Mapping \ AbstractClassMetadataFactory.php (311): Doctrine \ Common \ Persistence \ Mapping \ AbstractClassMetadataFactory-> getParentClasses ('Artikel')
# 4 ProjectDir \ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ Mapping \ ClassMetadataFactory.php (78): Doctrine \ Common \ P в ProjectDir \ vendor \ doctrine \ common \ lib \ Doctrine\Common\Persistence\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);
Обновление № 1
Если я попытаюсь использовать второй EntityManager "PreisAnalyse" сейчас, похоже, что он использует отображение "EntitiesAnlagenAnalyse", потому что он пытается получить столбец "t0.bezeichnung", который находится только в классе "Artikel" в "EntitiesAnlagenAnalyse". Но он запрашивает правильную базу данных, где "bezeichnung" не существует.
ИНФОРМАЦИЯ: Некоторые классы имеют одинаковое имя в обоих менеджерах.Таким образом, в обоих EntitiyManager'ах есть таблица Artikel.
Неустранимая ошибка PHP: необработанное исключение 'PDOException'
с сообщением 'SQLSTATE[42S22]: столбец не найден: 1054 Неизвестный столбец't0.bezeichnung'в' списке полей '' в ProjectDir\vendor\doctrine\dbal\lib\Doctrine\DBAL\Driver\PDOConnection.php:104
Трассировки стека:
# 0 ProjectDir \ vendor \ doctrine \ dbal \ lib \ Doctrine \ DBAL \ Driver \ PDOConnection.php (104): запрос PDO-> ('SELECT t0.artik...')
# 1 ProjectDir \ vendor \ doctrine \ dbal \ lib \ Doctrine \ DBAL \ Connection.php (833): запрос Doctrine\DBAL\Driver\PDOConnection-> ('SELECT t0.artik...')
# 2 ProjectDir \ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ Persisters \ Entity \ BasicEntityPersister.php (884): Doctrine \ DBAL \ Connection-> executeQuery ('SELECT t0.artik...', Array, Array)
# 3 ProjectDir \ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ EntityRepository.php (181): Doctrine \ ORM \ Persisters \ Entity \ BasicEntityPersister-> loadAll (Массив, NULL, NULL, NULL)
# 4 ProjectDir \ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ EntityRepository.php (164): Doctrine \ ORM \ EntityRepository- в ProjectDir\vendor\doctrine\dbal\lib\Doctrine\DBAL\Driver\AbstractMySQLDriver.php для линия 71
Обновление № 2
Теперь я попытался переключить строки в массиве автозагрузчика PSR-0, и он работает для "PreisAnalyseManager" и "AnlagenAnalyseManger", но только до тех пор, пока не достигнет запроса с классом "Artikel". Так что это определенно проблема с автозагрузчиком, и новый вопрос:
Как я могу определить пространства имен в автозагрузчике, чтобы доктрина правильно использовала его?
compose.json
{
"require": {
"doctrine/orm": "*"
},
"autoload": {
"psr-0":
{
"": ["EntitiesPreisAnalyse/src/", "EntitiesAnlagenAnalyse/src/"]
}
}
}
1 ответ
Решение состояло в том, чтобы использовать автозагрузчик PSR-4 вместо PSR-0, и, как сказал sadok-f в комментариях под моим вопросом, я добавил конкретные пространства имен и, наконец, пришел к этому composer.json:
{
"require": {
"doctrine/orm": "*"
},
"autoload": {
"psr-4":
{
"Preis\\": "EntitiesPreisAnalyse/src/",
"Anlagen\\": "EntitiesAnlagenAnalyse/src/"
}
}
}