0

を実現(私はそれがマルチテナントになると、データベースはしばしば見なされている知っている。しかし、これは私の質問ではありません。この問題は、データベースの話ではありません。)マルチテナントアプリケーション(構造)

私は、アプリケーションを作成します異なる顧客によって使用されます。彼らはほとんど同じことを見ることができます。しかし、一部の顧客にはいくつかの余分なボタンがあり、一部の機能は無効になっているか、または別のものがあります。

多くのif/elseステートメントまたはswitchステートメントを避けたいと思います。だから私は、一般的なモジュールと、必要に応じて異なるものを上書きまたは上書きする各顧客のための特別なモジュールを持つことができたと思った。次の理論的構造を見てください(すべてのファイルは通常のYiiファイルです)。

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 
... 

これはサウンドファイルの構造だと思います。少なくともそれは明らかで分かりやすいものです。顧客が何かを要求した場合、特定の顧客のファイルがあるかどうかを調べ、そのファイルを使用するか、一般的なモジュール(フォールバック)のファイルを使用するかどうかをアプリケーションが最初に調べるようにします。私の質問は、どうすればいいのですか?

どうすればいいですか?または、部分的にのみ可能ですか?コントローラとビューでのみ?私はビュー/コントローラ/モデルファイルには異なるアプローチが必要かもしれないと思います。私はクラスのオートローディングが適応できると思います。そして私は、ルーティング利用すると思うだろう(顧客が認証される必要がありますが、それは彼または彼女自身の顧客を使用することができます):

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

は、すべてこれは構成のか、依存性注入を行うことができますか?モジュールが必要ですか、またはファイル編成で十分ですか?

(思考:オーバーライドコントローラは単純なものでしたが、私はそのビューファイルがコントローラが別のビューのパスを設定するためにオーバーライドされます場合にのみ、上書きすることができると思います。。)

は、誰もがこれを解決するためのアイデアを持っていますか?これがコントローラーとビューで動作するなら、私はうれしいでしょう。しかし、モデルも素晴らしいだろう。あるいは、他の提案や代替アプローチを持っている人はいますか?ソリューションの一部しか知りませんが、私に教えてください。

満足のいく答えが時間とともに進化するかもしれないと私は考えます。しかし、他の人にとっては良い解決策を見出すことが役に立ちます。それでは、それを試してみましょう;-) ...またはこのタスクに適した別のフレームワークですか? :-(

答えて

0

あなたは、このようなコードで別のテーマを使用することができます。

  1. オーバーライドのYii \ベース\テーマにあなたのカスタム テーマコンポーネント
  2. を使用する
  3. 使用依存injenctionを空に設定エントリを作成しますあなたのテーマ 部品を作るために
  4. は/あなたのカスタムテーマファイルをコピー作成呼び出される

read this for theming instructions

read this for dependency injection instructions(またはどのように他のモデルを置換するために)この例では '@app/themes/mytheme' により '@app/views' を交換する方法を示し

共通\コンポーネントはTheme.php(カスタムテーマ成分)

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(); 
    } 

} 

共通\拡張子を\ \ bootstrap.phpの(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()); 
    } 
} 

共通\ CONFIG \ main.php(カスタムブートストラップ登録)

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

フロントエンド\ CONFIG \ main.php(ダミーテーマ設定を登録)

'components' => [ 
    'view' => [ 
     'theme' => [ 
      'basePath' => '@app/views', 
     ], 
    ], 
], 
関連する問題

 関連する問題