Symfony 4 меняет базы данных на лету

Я работаю над платформой блогов, у каждого блога своя база данных.

Мне нужно переключить соединение с базой данных на лету.

Я понимаю документацию

http://symfony.com/doc/current/doctrine/multiple_entity_managers.html

Но я бы хотел избежать добавления всего в файл конфигурации, поскольку их больше

более 50 баз данных.

Я пытался адаптировать этот код к Symfony 4, но у меня не получалось заставить его работать https://stackoverflow.com/a/9291896/9726140

Спасибо

>> У каждого блога своя база данных. Почему?

Frank B 07.05.2018 23:37

@FrankB, если каждый блог рассматривается как один клиент, почему бы и нет? Это не только лучше, но даже предложили так разделить

DonCallisto 08.05.2018 08:26

Есть ли другой способ сделать это без установки переменных среды? и установите config с переменной в соответствии с вашей базой данных. Но вам нужно установить 50 переменных env. Правильно?

Oscar 08.05.2018 12:30

Да, планирую более 50.

Bigbenny 08.05.2018 18:49

Возможное дублирование stackoverflow.com/questions/53151669/…

SlimenTN 21.11.2018 15:21

@SlimenTN, этот вопрос явно связан с symfony версии 3, и речь идет о версии 4. В 4 есть радикальные изменения, и код в этом другом сообщении не будет делать ничего, кроме радикального сбоя в версии 4. Пожалуйста, проверьте более тщательно, прежде чем заявлять о возможном дубликате.

Jacqueline Loriault 12.12.2018 16:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
6
1 353
2

Ответы 2

Возможно, вы можете попробовать это из контроллера:

$sql = "USE dbname";
$stmt = $this->getDoctrine()->getManager()->getConnection()->prepare($sql);
$stmt->execute();

Привет, Эндрю, спасибо за ответ. Но метод getConnection () не найден.

Bigbenny 08.05.2018 18:48

Привет, я использую Symfony 3.4, и этот метод мне подходит.

Andrew Vakhniuk 09.05.2018 00:36

В Symfony 4 были некоторые критические изменения, из-за которых некоторые вещи сейчас не существуют или просто не работают.

Jacqueline Loriault 27.12.2018 04:41

Я придумал кое-что для моей собственной ситуации, в которой у каждого клиента был свой субдомен. Я могу воспользоваться разделом виртуальных хостов конфигурации 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)%'

Другие вопросы по теме