4

私のプロジェクトはマルチテナントSaaSに基づいています。

私には複数のクライアント(会社)があり、各クライアントには複数のユーザーがいます-それらはすべて同じデータベースレイアウトを使用します。

各クライアントには独自のデータベースがあるため、ユーザー認証中に、ユーザーをそのユーザーの会社のデータベースに関連付けるマスターデータベースを構築したいと思います。

各データベースの構造は同じです...データのみが異なります。

異なる会社の異なるデータベースを保持できるように、データベース内のデータが混ざり合うことはありません。

アプリケーションの作成時には、クライアントの数(およびそのためのデータベースの数)は不明であるため、ブートストラップスクリプトにすべての接続を含めることはできません。

さて、私がやりたいのは、ブートストラップにあるDB接続を動的に変更するか、ユーザーがサインインするための新しい接続を動的に作成する機能を持つことです。Yiiでこれを解決する簡単な解決策はありますか?それでもAR、クエリを使用しますビルダー?

私はこの解決策を見ましたが、私にはうまくいきませんでしたhttp://www.yiiframework.com/forum/index.php?/topic/5385-dynamic-db-connection/

これは、私の構成ファイルが1つのデータベースを実行しているスクリプトを今日どのように検索するかです。ユーザーが属し、アプリがYiiで使用するデータベースを制御するマスターデータベースを呼び出したいのですが、何か考えはありますか?

<? php

 $language = 'en'; 

  $currencyBaseCode = 'USD';

 $theme = 'default';

 $connectionString = 'mysql:host=localhost;port=3306;dbname=master';

 $username = 'root';

 $password = 'YOUR PASS';

 $memcacheServers = array( // An empty array means memcache is not used.

 array(

'host' => '127.0.0.1',

'port' => 11211, // This is the default memcached port.


 'weight' => 100,

  ),

  );

  $adminEmail = 'EMAIL ADDRESS';

  $installed = true; // Set to true by the installation process.

  $maintenanceMode = false; // Set to true during upgrade process or other maintenance tasks.

  $instanceConfig = array(); //Set any parameters you want to have merged into configuration array.

  //@see CustomManagement

  $instanceConfig['components']['request']['hostInfo'] = 'website url';

  $instanceConfig['components']['request']['scriptUrl'] = '/app/index.php';

  $urlManager = array (); // Set any parameters you want to customize url manager. 
  ? >
4

1 に答える 1

0

構成ファイルで master データベースを定義し、通常の AR クラスを使用してそれに接続し、資格情報を取得します。次に、接続を閉じます。

次に、AR クラス、具体的にはgetDbConnection()メソッドを拡張します。関連する資格情報を取得し、パラメーターとして新しい CDbConnection オブジェクトに渡します。

認証情報を取得するための最初の DB リクエストは、パフォーマンスを大幅に低下させるため、Redis または Memcached を使用してメモリ内に保存する必要があります。Yii はネイティブではそうしません。

これにはいくつかの方法があります。

  • さまざまな構成ファイルをロードするさまざまなフロント コントローラー。それぞれが個別のアプリによって動的に生成または破棄されます。
  • 1 つの大きなデータベース。各レコードには、それが属するクライアントを定義するためのキーがあります。
  • 1 つの大きなデータベース。テーブル名の一部としてクライアント名を使用することにより、テーブルを複製できます。

これは Yii が実際に行うように設計されたものではないため、これらのいずれも Yii では簡単ではありません。

于 2013-02-09T16:07:30.770 に答える