2017-01-16 22 views
1

symfonyに異なるparameters.ymlを読み込むことは可能ですか?私はSaaSのマルチテナントAPPを持っており、loginアクション時に正しいDBにユーザをディスパッチするために、各テナントにparameter.yml(config DBを持つ)の異なるloadを設定したいと考えています。Symfony:異なるparameters.ymlを読み込むことは可能ですか?

ありがとうございます!

EDIT:SOLVED!

私はそれはのようにフォルダ内のさまざまなテナント構成を配置解く:

app 
---config 
------tenantA 
---------config.yml 
---------config_dev.yml 
---------config_prod.yml 
---------parameters.yml 
------tenantB 
---------config.yml 
---------config_dev.yml 
---------config_prod.yml 
---------parameters.yml 
------tenantC 
---------config.yml 
---------config_dev.yml 
---------config_prod.yml 
---------parameters.yml 
.... 

そして、kernelApp.phpのローダーを修正する:

$ loader->負荷(の$ this - > getRootDir( ) '/ config/TENANT /config_'.$this->getEnvironment().'.yml');

これは良い習慣であるかどうかわかりませんが、うまくいきます!

+0

あなたが教義の移行を使用したい場合は、あなたが問題に実行されます、それはこの設定とは独立しているので、 。 複数のデータベースと同じソースを使用する正しい方向に指摘してくれたので、私は教義の移行を望むなら、ここで読むことができます。あなたに感謝します。 https: //stackoverflow.com/questions/45633339/symfony3-doctrine-migration-with-multiple-databases – rebru

答えて

0

ここにはいくつかの可能性があります。

テナントの番号が定数またはそれに近い場合(新しいテナントはごくまれに追加されます)、単に​​のようにいくつかの接続を設定することができます。その後あなたが

$em = $this->get('doctrine')->getManager($dynamicValue); 

を呼び出すことにより、必要なEntityManagerインスタンスを取得することができ、このアプローチの欠点は、あなたがテナントを削除/作成/更新必要あなたのconfig.ymlたびに修正しなければならないということです。

しかし、あなたはより柔軟なアプローチをしたい場合は、データベース接続を管理するための独自のクラスを実装することができます

<?php 

namespace AppBundle\Service; 

use AppBundle\Entity\Database; 
use Doctrine\DBAL\Connection; 
use Doctrine\DBAL\DBALException; 
use Doctrine\DBAL\DriverManager; 

/** 
* Class ConnectionManager 
* @package AppBundle\Service 
*/ 
class ConnectionManager 
{ 
    /** 
    * @var Connection[] 
    */ 
    protected $connections = []; 

    /** 
    * @param Database $database 
    * @return Connection 
    * @throws DBALException 
    */ 
    public function getConnection(Database $database) 
    { 
     $params = [ 
      'dbname' => $database->getName(), 
      'user' => $database->getUser(), 
      'password' => $database->getPassword(), 
      'host' => $database->getHost(), 
      'driver' => 'pdo_mysql', 
     ]; 

     $key = $this->getKey($params); 
     if (isset($this->connections[$key])) { 
      return $this->connections[$key]; 
     } 

     $conn = DriverManager::getConnection($params); 
     $this->connections[$key] = $conn; 
     return $conn; 
    } 

    /** 
    * @param array $params 
    * @return string 
    */ 
    protected function getKey($params) 
    { 
     sort($params); 
     return md5(implode('.', $params)); 
    } 
} 
+0

ありがとう@Andrey。 symfonyの正しいDBへの「ログイン」命令のディスパッチを探しています。私は多くのデータベース(各テナントに1つ)を持っていますが、ユーザーがsymfonyにログオンすると、ordersはparameters.ymlで定義されたDBを打ち切ります。私はsymfonyのユーザログインの前に、ドメインによって正しいparatemers.ymlをロードすることを探しています。 (私の英語については申し訳ありません:/) –

+0

@CarlosCarmona - リクエストに基づいて別のparameter.ymlが必要ですか?起こることはありません。すべての設定は一度行ってからキャッシュします。各要求に対して常に同じです。この答えが示すような何かをする必要があります。 – Cerad

+0

@Andrey私はappKernel de corret環境によってドメインごとにロードする(app/config/tenantX)のdifferentsフォルダに異なるテナント設定を配置するように解決しました。それはうまく動作します! :) –

関連する問題