Laravel 5 Multi-Tenancy App mit separaten Datenbanken - Benutzer haben Zugriff auf mehrere Installationen
In den letzten Jahren habe ich eine sehr angepasste PHP / MySQL-Anwendung entwickelt, die für eine Reihe von Clients verwendet wird. Bisher habe ich für jeden Client eine neue Datenbank und eine neue Installation erstellt.
Das erste offensichtliche Problem besteht darin, mehrere Installationen mit Codeänderungen auf dem neuesten Stand zu halten. Ein zweites Problem ist, dass jede Installation eine große Anzahl von Benutzern hat. und für die meisten Kunden; Einige dieser Benutzer sind die gleichen - und sie müssen eine Reihe separater Benutzerkonten und URLs haben, an die sie sich erinnern müssen.
Ich verschiebe die Anwendung derzeit auf Laravel 5 und suche nach der besten Implementierung für Mandantenfähigkeit. also suche ein wenig rat zur bestmöglichen umsetzung. Ich habe Laravel schon einmal benutzt, bin aber keineswegs ein Experte.
Das ist, was ich denke, soweit Setup.
1 Master-Datenbank mit Tabellen für:
Alle BenutzerkontoinformationenAccess Control Table - Auf welche Installationen können Benutzer zugreifen? Wie hoch ist die Benutzerebene für diese Installation?Konfigurationstabelle für jede Installation - Datenbankverbindungsinfo, Grundkonfiguration usw.Dann eine separate Datenbank für jede Installation, die alle Informationen enthält, die für diese Installation benötigt und an diese übermittelt wurden.
Das ideale Setup besteht darin, dass ein Benutzer zu einer Unterdomäne wechseln kann, z. B. Installationsname.Appname.com. Melden Sie sich mit ihren Hauptanmeldedaten an und wechseln Sie automatisch zur erforderlichen Installation. ODER gehen Sie zu appname.com, melden Sie sich an und wählen Sie die Installation aus, zu der Sie eine Verbindung herstellen möchten.
Meine Fragen sind:
Ist dies das beste Arrangement, um das zu erreichen, wonach ich suche. Was ist die beste Methode zum Speichern der vom Benutzer betrachteten Installation (Sitzungsvariable)Kann ich ein Modell zwischen 2 Datenbanken definieren? Definieren Sie möglicherweise eine Verbindung als Masterverbindung und anschließend dynamisch eine andere Verbindung mithilfe der Datenbankverbindungsinformationen in der Masterdatenbank, um eine Verbindung zur richtigen Installation herzustellen. - Das System muss häufig die Benutzerinformationen auf Zugriffsebene usw. überprüfen.Ich bin sicher, dass es viele Probleme gibt, an die ich nicht gedacht habe; Aber wenn jemand irgendwelche Links oder Anleitungen hat, die helfen könnten, wäre das großartig. Ich habe zum ersten Mal eine Frage zu SO gestellt, habe aber in der Vergangenheit hier eine Menge Forschungshilfe gefunden. Vielen Dank an die Community!
UPDATE - Ich denke, ich habe jetzt eine Möglichkeit, dies zum Laufen zu bringen. Verwendung separater Datenbanken wie oben beschrieben; einstelle
protected $connection = 'tenant_connection'
in den Modellen, die sich auf mandantenspezifische Datenbankinhalte beziehen.
Dann setzen Sie irgendwo in einer Header-Datei die gewünschte tenant_connection basierend auf einer Sitzungsvariablen, die bei login / by subdomain gesetzt wurde.
$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.
Angenommene Beziehungen funktionieren verbindungsübergreifend. Ich verstehe nicht, warum das nicht funktionieren würde. Sie müssen nur den besten Ort ermitteln, um die Mandantenverbindung einzurichten.