Symfony:可能加载不同的参数.yml?

时间:2017-01-16 08:27:02

标签: symfony parameters multi-tenant saas

可以在symfony上加载不同的parameters.yml吗?我有一个SaaS多租户APP,我希望基于每个租户加载不同的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() '/配置/的 TENANT /配置_' $这 - > getEnvironment()。 'YML。');

我不知道这是不是很好,但效果很好!

1 个答案:

答案 0 :(得分:0)

你有几种可能性。

如果租户的号码是常数或接近它(很少添加新租户),您只需设置几个连接,如here所述。之后,您可以通过调用

获得必要的EntityManager实例
$em = $this->get('doctrine')->getManager($dynamicValue);

此方法的缺点是,每次需要创建/更新/删除租户时,您必须修改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));
    }
}