Как настроить 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/"
      }
  }
}
Другие вопросы по тегам