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.
Предполагая, что отношения будут работать через связи; Я не понимаю, почему это не сработает; Просто нужно найти лучшее место, чтобы установить связь с арендатором.