Моя цель — подключить два разных менеджера документов к разным базам данных, которые используют одни и те же модели баз данных.
Я сильно изменил свою модель базы данных, и я хотел бы написать собственный скрипт миграции, который извлекает объекты из старой модели, считывает ее значения, а затем создает новый объект в новой схеме с информацией о старом объекте.
Я нашел связанный вопрос stackoverflow здесь:
Работа с двумя менеджерами сущностей в одном комплекте в Symfony2
Тем не менее, это решение предлагает использовать разные префиксы для каждой базы данных и хранит классы для модели данных в разных папках:
doctrine:
dbal:
default_connection: default
connections:
default:
driver: %database_driver%
host: %database_host%
port: %database_port%
dbname: %database_name%
user: %database_user%
password: %database_password%
charset: UTF8
second:
driver: %database_sqlite_driver%
host: ~
port: ~
dbname: %database_sqlite_shop_name%
path: %database_sqlite_shop_name%
user: ~
password: ~
charset: UTF8
orm:
auto_generate_proxy_classes: %kernel.debug%
default_entity_manager: default
entity_managers:
default:
connection: default
mappings:
YourBundle:
# you must specify the type
type: "annotation"# The directory for entity (relative to bundle path)
dir: "Entity/FirstDb"#the prefix
prefix: "Your\Bundle\Entity\FirstDb"shop:
connection: second
mappings:
YourBundle:
type: "annotation"#here the second path where entity for the connection stand
dir: "Entity/SecondDb"#the prefix
prefix: "Your\Bundle\Entity\SecondDb"
Мне бы очень хотелось, чтобы два разных объекта менеджера документов имели одинаковые модели в одной папке, но были связаны с разными базами данных. Это возможно?
Я обнаружил, что действительно возможно подключиться к разным базам данных в одном и том же Symfony Bundle. Этот ответ привел меня к возможному решению:
https://stackoverflow.com/a/15110867/2174832
#services.yml
acme_app.dynamic_connection:
class: %acme.dynamic_doctrine_connection.class%
calls:
- [setDoctrineConnection, @doctrine.dbal.default_connection]]<?php
namespace Acme\Bundle\AppBundle;
use Doctrine\DBAL\Connection;
use Symfony\Component\HttpKernel\Exception\ServiceUnavailableHttpException;
use Exception;
class DynamicDoctrineConnection
{
/**
* @var Connection
*/
private $connection;
/**
* Sets the DB Name prefix to use when selecting the database to connect to
*
* @param Connection $connection
* @return SiteDbConnection $this
*/
public function setDoctrineConnection(Connection $connection)
{
$this->connection = $connection;
return $this;
}
public function setUpAppConnection()
{
if ($this->request->attributes->has('appId')) {
$connection = $this->connection;
$params = $this->connection->getParams();
// we also check if the current connection needs to be closed based on various things
// have left that part in for information here
// $appId changed from that in the connection?
// if ($connection->isConnected()) {
// $connection->close();
// }
// Set default DB connection using appId
//$params['host'] = $someHost;
$params['dbname'] = 'Acme_App'.$this->request->attributes->get('appId');
// Set up the parameters for the parent
$connection->__construct(
$params, $connection->getDriver(), $connection->getConfiguration(),
$connection->getEventManager()
);
try {
$connection->connect();
} catch (Exception $e) {
// log and handle exception
}
}
return $this;
}
}
С помощью вышеприведенного решения можно написать службу, которая может быть вызвана для изменения базы данных, к которой текущий менеджер сущностей подключен к другой базе данных.
К сожалению Решение выше работает только для драйвера PDO (Mysql).
Так как наш стек технологий включает в себя mongodb, и мы используем Учение-Mongodb расслоение Я должен был искать другое решение.
В документации doctrine-mongodb есть раздел о настройке собственного менеджера документов:
http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/introduction.html
Мне не удалось получить правильные отображения документов doctrine-mongodb odm для работы с инструкциями в документе, и поэтому единственное решение для меня было создать простое соединение с mongoclient PHP:
$mongo = new \Mongo('mongodb://localhost:27017');
$legacyDbDocumentMangager = $mongo->selectDB('backed_up_prod_db');
$legacyUserCollection = $legacyDbDocumentMangager->selectCollection('User');
$user = $legacyUserCollection->findOne(array('email' => '[email protected]'));
Единственное различие между этим простым драйвером php mongodb и doctrine-mongodb odm состоит в том, что результаты запросов этого драйвера являются ассоциативными массивами, а результаты doctrine-mongodb odm diver являются объектами.
Надеюсь эта информация кому-нибудь пригодится.
Других решений пока нет …