Daten-Trennung in einer Symfony Multi-Tenant-App Lehre mit
-
27-09-2019 - |
Frage
Ich versuche, eine Multi-Tenant-Anwendung zu implementieren, dh
- Daten aller Kunden in einer einzigen Datenbank
- jede gemeinsame Tabelle hat ein tenant_id
Feld separate Daten
Ich wünsche Datentrennung zu erreichen, indem das Hinzufügen where('tenant_id = ', $user->getTenantID())
{pseudoc-Code}
für alle SELECT-Abfragen
Ich konnte keine Lösung up-front finden, aber hier sind mögliche Ansätze Ich erwäge.
1) roher Ansatz:
Alle fetchAll
und fetchOne
Funktionen in jeder Klasse Customizing (I verrückt werden!)
2) mit Hörer:
möglicherweise Codierung für das preDqlSelect
Ereignis und das Hinzufügen der ‚wo‘ auf alle Fragen
3) Überschreibung buildQuery
(): konnte nicht ein Beispiel dafür für Front-End finden
4) implementieren contentformfilter
: wieder brauchen einen Zeiger
würde schätzen, wenn jemand diese und Kommentar auf efficieny, Eignung bestätigen konnte. Auch, wenn jemand erreicht Multitenancy mit einer anderen Strategie, pl Aktie. Dank
Lösung 3
Ich habe die sfMultiTenantPlugin veröffentlicht, es finden Sie hier: http://www.symfony-project.org/plugins/sfMultiTenantPlugin
Andere Tipps
Ich arbeite eine Lösung aus mit Lehre Nehmen Hörer durch das Ereignis preDqlSelect Codierung. Ich denke, dies ist der beste und einfachste Weg, um Dinge in allgemeiner Weise zu tun, anstatt jede Tabellenklasse und Schreiben Mieter bewusst Abfragen zu ändern. Mit Hörer, wird Multi-Tenancy für Entwickler vollständig transparent sein.
Vielen Dank für die Teilnahme.
Ich glaube, dass die mehr machbar und sicher eine neue Funktion zu erstellen, ist ein Mieter bewusst Abfrage abgerufen werden, ist dies ein Beispiel ... Ersetzen MyModel mit dem Namen Ihrer Tabelle:
// lib/model/doctrine/MyModelTable.class.php
class MyModelTable extends Doctrine_Table
{
public function createTenantAwareQuery($userId)
{
$q = $this->createQuery('m')
->where('tenant_id = ', $userId);
return $q;
}
}
Dann ist diese neue Funktion verbrauchen nur rufen:
$myVar = Doctrine_Core::getTable('MyModel')->createTenantAwareQuery()
->where('something = ', $value);
Auf diese Weise können Sie eine „Tenant Aware Abfrage“ erstellen, wenn nötig ... Sie nur diese Funktion nutzen, wenn nötig ... Auch im Admin-Generator gibt es eine Art und Weise in der Konfigurationsdatei die Standardabfragemethode außer Kraft zu setzen:
# apps/backend/modules/(module)/config/generator.yml
config:
list:
table_method: retrieveTenantAwareResult
Das einzige, was links ist, diese Methode zu erstellen.
Hope diese Antwort für Sie funktioniert =)
Das sfMultiTenantPlugin
Plugin funktioniert nicht für leftJoin
. Wenn A beitreten B links und B leer ist, wird das Plugin eine leere Ergebnismenge zurück.