2017-01-16 117 views
1

可以在symfony中加载不同的parameters.yml吗?我有一个SaaS多租户应用程序,我希望基于每个租户加载不同的parameters.yml(带有配置DB),以便在登录操作时将用户分配到正确的数据库。Symfony:可能会加载不同的parameters.yml?

非常感谢!

编辑:已解决!

我解决它安排不同租户的配置文件夹中,如:

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的装载机:

$装载机>负载($这个 - > 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上寻找dispacht de“登录”顺序到正确的DB。我有很多数据库(每个租户都有一个数据库),但是当用户登录symfony时,该命令在参数parameters.yml上确定DB。只是我在用户登录symfony之前寻找域加载正确的paratemers.yml。 (对不起我的英语:/) –

+0

@CarlosCarmona - 听起来像你想根据请求不同的parameter.yml?不会发生。所有配置的东西都做了一次,然后缓存。每个请求都会一样。你需要做这样的回答。 – Cerad

+0

@Andrey我解决了它在(app/config/tenantX)的不同文件夹中安排不同的租户配置,通过域的appKernel de corret环境加载。它工作正常! :) –