可以在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。');
我不知道这是不是很好,但效果很好!
答案 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));
}
}