Задать вопрос
@adiletmurzaliev

Multi-tenant архитектура на Symfony 4?

В общем перерыл весь интернет, но так и не нашел ответа. Хочу посоветоваться с Вами.

Ситуция такая, требуется настроить проект с нуля на Symfony 4, чтобы он поддерживал multi-tenant архитектуру, т.е. одно приложение (код) -> много баз данных с одинаковой схемой.
К примеру: есть подсайты client1.site.com, client2.site.com и т.д. При открытии каждого этого сайта происходит подключение к главной БД, откуда берется информация по БД клиента, далее уже происходит подключение непостредственно к этой БД клиента. Такой небольшой SaaS проект.

Что я нашел в интернете по этой теме:
Статья
Видео

Но это мне не помогло. Я пытался переопределить класс Doctrine\DBAL\Connection с помощью настройки wrapper_class. В итоге получил кучу ошибок, от которых не удалось избавиться. Далее пытался во внутренностях доктрины копаться, тоже не справился. В общем, долго описывать все мои попытки настроить доктрину, консольные команды для обновления схем и накатывания миграций и т.п. Может быть кто уже этим занимался, или в сети есть какой-либо свежий open source проект с такой архитектурой?
  • Вопрос задан
  • 1142 просмотра
Подписаться 5 Средний 2 комментария
Пригласить эксперта
Ответы на вопрос 3
@adiletmurzaliev Автор вопроса
В общем поразибрался немного, что-то да вышло. Вот репозиторий. Если кто заинтересован в этой теме, напишите пожалуйста свой, так сказать, code review. Может доработаем это решение вместе. Сейчас там не работают фикстуры для tenant БД, т.к. с 3.0 версии убрали опцию --fixtures, а также там есть проблема с дефолтным подключением, которое почему-то не меняется.

Также добавлю, что использовал версию Symfony 4.2, где поменяли логику работы с .env файлом.
Ответ написан
Комментировать
@nicandr
Если я вас правильно понял то вам нужно много подключений к разным базам данных, для этого есть Multiple Entity Managers
doc https://symfony.com/doc/current/doctrine/multiple_...
Так же вы в консоли можете указать куда заливать базу данных:
bin/console doctrine:database:create --em='ваше_название_подключения'
и оно зальет базу по этому подключению.
Ну или посмотрите в хелпере как там указать название для connection bin/console doctrine:database:create --help
Вам только остается по роуту определить какое подключение(connection) использовать. Это можно сделать например в event ну или как то еще, зависит от ващей логики.
Ответ написан
Комментировать
LobsterJoe
@LobsterJoe
Вот неплохое видео с похожей задачей: Symfoniacs #9: Особенности построения SaaS-сервиса....

Рекомендую к просмотру. Ребята решали подобный вопрос, пробрасывая конфигурацию подключения к БД через кастомный DI контейнер для каждого аккаунта в системе.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы