Неожиданное поведение менеджера сущности доктрины - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть вспомогательный сервис, который на лету связывает меня с базой данных.

$databaseName = 'db_x'; 

$em = $this->entityManagerProvider->get($databaseName);

Я могу использовать этот менеджер сущностей следующим образом:

$car = new Car();
$car->setName('Audi');

$em->persist($car);
$em->flush();

Он работает хорошо!Объект был вставлен в мой db_x

Но если я запустил метод репозитория на этом менеджере сущностей:

$em->getRepository('App\Entity\Car')->findById(1);

Затем менеджер сущностей попытается запустить мою базу данных по умолчанию, а не db_x.Как это возможно?

Мой сервис для переключения базы данных:

namespace App\Utils\Database;

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;

class EntityManagerProvider
{
    /**
     * @var EntityManagerInterface
     */
    protected $entityManager;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    /**
     * @param $databaseName
     * @return EntityManagerInterface
     * @throws \Doctrine\ORM\ORMException
     */
    public function get($databaseName): EntityManagerInterface
    {
        return EntityManager::create(
            $this->configureParams($databaseName),
            $this->entityManager->getConfiguration(),
            $this->entityManager->getEventManager()
        );
    }

    /**
     * @param string $databaseName
     * @return array
     */
    private function configureParams(string $databaseName): array
    {
        $params = $this->entityManager->getConnection()->getParams();

        unset(
            $params['dbname'],
            $params['path'],
            $params['url'],
            $params["wrapperClass"]
        );

        $params['dbname'] = $databaseName;

        return $params;
    }
}
...