Laravel 5 Multi-Tenancy App с отдельными базами данных - пользователи имеют доступ к нескольким установкам

За последние пару лет я разработал очень настраиваемое приложение PHP / MySQL, которое используется для ряда клиентов. До этого момента я создавал новую базу данных и новую установку для каждого клиента.

Первой очевидной проблемой здесь является поддержание нескольких установок в актуальном состоянии с любыми изменениями кода; вторая проблема заключается в том, что каждая установка имеет большое количество пользователей; и для большинства клиентов; некоторые из этих пользователей одинаковы - и им нужно иметь несколько отдельных учетных записей и URL-адресов, которые следует запомнить.

Сейчас я перевожу приложение на Laravel 5 и ищу наилучшую реализацию для мультитенантности; так что ищите маленький совет по лучшей реализации. Я раньше пользовался Laravel, но ни в коем случае не эксперт.

Это то, что я думаю о настройке.

1 Основная база данных, которая содержит таблицы для:

Вся информация учетной записи пользователяТаблица контроля доступа - к каким установкам пользователи могут получить доступ; каков их уровень пользователя на этой установке.Таблица конфигурации для каждой установки - информация о подключении к базе данных, базовая конфигурация и т. Д.

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

Идеальной настройкой является то, что пользователь может перейти к поддомену, т. Е. Имя_установки.appname.com; войдите в систему с их основными данными для входа и автоматически перейдите к необходимой установке; ИЛИ перейдите на appname.com, войдите в систему и выберите, к какой установке подключиться.

Мои вопросы:

Это лучшая договоренность для достижения того, что я ищу.Каков наилучший метод для сохранения установки, на которую смотрит пользователь (переменная сеанса)Могу ли я определить модель между двумя базами данных - возможно, определите одно соединение как главное соединение, а затем динамически определите другое соединение, используя информацию о соединении с базой данных в главной базе данных для подключения к правильной установке. - системе часто нужно проверять информацию пользователя об уровне доступа и т. д.

Я уверен, что есть много вопросов, о которых я не задумывался; но если у кого-то есть какие-либо ссылки или рекомендации, которые могут помочь, это было бы замечательно. Впервые задаю вопрос о SO, но в прошлом нашла огромную помощь в исследованиях, так что спасибо сообществу!

ОБНОВЛЕНИЕ - Так что я думаю, что у меня есть способ сделать эту работу сейчас; использование отдельных баз данных, как указано выше; задавать

protected $connection = 'tenant_connection'

в моделях, касающихся содержания базы данных конкретного арендатора.

Затем где-нибудь в заголовочном файле установите требуемое tenant_connection на основе переменной сеанса, которая была установлена ​​при входе в систему / субдоменом.

$tenant = Installation::where('installation', '=', $session['installation'])->first();
Config::set('database.connections.tenant_connection', array('driver' => 'mysql', 'host' => $tenant->db_hostname, 'username' => $tenant->db_username)... etc.

Предполагая, что отношения будут работать через связи; Я не понимаю, почему это не сработает; Просто нужно найти лучшее место, чтобы установить связь с арендатором.

Ответы на вопрос(3)

Ваш ответ на вопрос