Я работаю над платформой блогов, у каждого блога своя база данных.
Мне нужно переключить соединение с базой данных на лету.
Я понимаю документацию
http://symfony.com/doc/current/doctrine/multiple_entity_managers.html
Но я бы хотел избежать добавления всего в файл конфигурации, поскольку их больше
более 50 баз данных.
Я пытался адаптировать этот код к Symfony 4, но у меня не получалось заставить его работать https://stackoverflow.com/a/9291896/9726140
Спасибо
@FrankB, если каждый блог рассматривается как один клиент, почему бы и нет? Это не только лучше, но даже предложили так разделить
Есть ли другой способ сделать это без установки переменных среды? и установите config с переменной в соответствии с вашей базой данных. Но вам нужно установить 50 переменных env. Правильно?
Да, планирую более 50.
Возможное дублирование stackoverflow.com/questions/53151669/…
@SlimenTN, этот вопрос явно связан с symfony версии 3, и речь идет о версии 4. В 4 есть радикальные изменения, и код в этом другом сообщении не будет делать ничего, кроме радикального сбоя в версии 4. Пожалуйста, проверьте более тщательно, прежде чем заявлять о возможном дубликате.






Возможно, вы можете попробовать это из контроллера:
$sql = "USE dbname";
$stmt = $this->getDoctrine()->getManager()->getConnection()->prepare($sql);
$stmt->execute();
Привет, Эндрю, спасибо за ответ. Но метод getConnection () не найден.
Привет, я использую Symfony 3.4, и этот метод мне подходит.
В Symfony 4 были некоторые критические изменения, из-за которых некоторые вещи сейчас не существуют или просто не работают.
Я придумал кое-что для моей собственной ситуации, в которой у каждого клиента был свой субдомен. Я могу воспользоваться разделом виртуальных хостов конфигурации apache, чтобы добавить дополнительную переменную среды и использовать ее для установки имени базы данных.
В apache: # ...
SetEnv SUBDOMAIN_NAME "db_name"
</VirtualHost>
В моем .env для разработки (это будет выше в конфигурации apache для prod) В принципе, просто удалите имя базы данных из URL-адреса
DATABASE_URL=mysql://root:root@mysql:3306/
Наконец, в моем doctrine.yaml в параметрах я установил значение по умолчанию. Таким образом, мы не выдаем ошибки ненастроенным клиентам и можем показать красивое чистое сообщение о необходимости установки для техподдержки:
env(SUBDOMAIN_NAME): 'default_customer'
а в doctrine.yaml замените значение url на
url: '%env(resolve:DATABASE_URL)%%env(resolve:SUBDOMAIN_NAME)%'
>> У каждого блога своя база данных. Почему?