0

(Diese Frage nicht über Datenbanken ist. Ich weiß, Datenbanken oft angesehen werden, wenn es um Multi-Tenancy kommt. Aber das ist nicht meine Frage.)eine Multi-Tenant-Anwendung (Struktur)

Ich erstelle eine Anwendung das wird von verschiedenen Kunden verwendet werden. Sie können meist die gleichen Dinge sehen und tun. Einige Kunden haben jedoch hier und da einige zusätzliche Schaltflächen, einige Funktionen sind deaktiviert oder etwas anderes ist anders.

Ich möchte viele If/Else oder Switch-Anweisungen vermeiden. Also dachte ich, dass ich für jeden Kunden ein allgemeines Modul und spezielle Module haben könnte, die nach Bedarf verschiedene Dinge überschreiben oder überschreiben. Schauen Sie sich die folgende theoretische Struktur (alle Dateien sind die normalen Yü-Dateien):

app 
    general 
     controllers 
      OrderController 
      InvoiceController 
      ShippingController 
     views 
      order 
       index, view, update, create, _form 
      invoice 
       index, view, update, create, _form 
      shipping 
       index, view, update, create, _form 
      layout 
       main 
     models 
      Order 
      Invoice 
      Shipping 
    customerA 
     controllers 
      OrderController // some action is different 
    customerB 
     views 
      invoice 
       view   // some buttons should be overridden 
      layout 
       main.php  // other page structure 
    customerC 
     views 
      order 
       index  // table gets some additional columns 
     model 
      Order   // has some more properties 
    customerD 
     // this customer exists but has nothing that must be changed 
     // it uses all what is in general 
    ... 
web 
common 
console 
... 

Ich denke, dies ist eine Tondatei Struktur ist. Zumindest ist es klar und verständlich. Nun möchte ich irgendwie feststellen: Wenn ein Kunde etwas anfordert, wird die Anwendung zuerst schauen, ob es Dateien für den bestimmten Kunden gibt und sie verwendet, oder sie verwendet die Dateien im allgemeinen Modul (Fallback). Meine Frage ist: Wie kann ich das tun?

Wenn es möglich ist, wie? Oder ist es nur teilweise möglich, z.B. nur mit Controllern und Ansichten? Ich nehme an, dass verschiedene Ansätze für View/Controller/Model-Dateien benötigt werden. Ich nehme an, dass das Autoloading von Klassen angepasst werden könnte. Und ich würde denken, das Routing zu nutzen (obwohl der Kunde authentifiziert werden muss, so kann er nur seine eigenen Kunden verwenden):

http://example.com/customerA/invoice/view?id=1234 

Kann das alles mit der Konfiguration durchgeführt werden oder mit Dependency Injection? Benötige ich Module oder ist die Dateiorganisation ausreichend?

(Gedanken: Übergeordnete Steuerungen einfach sein könnte, aber ich denke, dass View-Dateien nur dann, wenn der Controller eine andere Ansicht Pfad zu setzen außer Kraft gesetzt wird außer Kraft gesetzt werden kann..)

Hat Ideen jemand dieses Problem zu lösen? Ich würde mich freuen, wenn dies mit Controllern und Views funktioniert. Aber Modelle wären auch nett. Oder hat jemand andere Vorschläge oder alternative Ansätze? Lassen Sie es mich wissen, auch wenn Sie nur Teile der Lösung kennen.

Ich nehme an, eine befriedigende Antwort kann sich mit der Zeit entwickeln. Aber es wäre hilfreich für andere, eine gute Lösung zu finden. Lasst uns daran arbeiten ;-) ... Oder ist ein anderes Framework für diese Aufgabe besser geeignet? :-(

Antwort

0

können Sie separate Themen von Code wie folgt verwendet werden:

  1. Überschreibung yii \ base \ Theme
  2. injenction Verwendung Abhängigkeit Ihrer benutzerdefinierten Theme Komponente
  3. machen einen leeren Konfigurationseintrag zu verwenden, zu machen, erhalten Sie Ihr Thema Komponente
  4. erstellen/kopieren Sie Ihre benutzerdefinierten Designs Dateien
  5. genannt

read this for theming instructions

read this for dependency injection instructions (oder wie andere Modelle ersetzen)

Dieses Beispiel zeigt, wie '@app/views' ersetzen durch '@app/themes/mytheme'.

common \ components \ theme.php (eigenes Thema Komponente)

namespace common\components; 
use Yii; 

class Theme extends \yii\base\Theme 
{ 

    public function init() { 
     // todo: your logic goes here 
     $this->pathMap = [ 
      '@app/views' => [ 
       '@app/themes/mytheme', 
      ] 
     ]; 

     return parent::init(); 
    } 

} 

common \ Extensions \ Bootstrap.php (custom Bootstrap für DI)

namespace common\extensions; 

use Yii; 
use yii\base\Application; 
use yii\base\BootstrapInterface; 
use yii\helpers\Url; 

class Bootstrap implements BootstrapInterface 
{ 
    public function bootstrap($app) 
    { 
     Yii::$container->set(\yii\base\Theme::className(), \common\components\Theme::className()); 
    } 
} 

common \ config \ main.php (Register individuelle bootstrap)

'bootstrap' => [ 
    'common\extensions\Bootstrap', 
], 

Frontend \ config \ main.php (Register dummy Thema Konfiguration)

'components' => [ 
    'view' => [ 
     'theme' => [ 
      'basePath' => '@app/views', 
     ], 
    ], 
], 
Verwandte Themen