Symfony:It';s可能加载不同的参数。yml?
可以在symfony上加载不同的parameters.yml吗?我有一个SaaS multitenant应用程序,我希望根据每个租户加载differents parameters.yml(带有配置数据库),以便在登录操作时将用户分配到正确的数据库 非常感谢 编辑:已解决强> 我解决了在文件夹中安排不同租户配置的问题,如:Symfony:It';s可能加载不同的参数。yml?,symfony,parameters,multi-tenant,saas,Symfony,Parameters,Multi Tenant,Saas,可以在symfony上加载不同的parameters.yml吗?我有一个SaaS multitenant应用程序,我希望根据每个租户加载differents parameters.yml(带有配置数据库),以便在登录操作时将用户分配到正确的数据库 非常感谢 编辑:已解决 我解决了在文件夹中安排不同租户配置的问题,如: app ---config ------tenantA ---------config.yml ---------config_dev.yml ---------config_pr
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->load($this->getRootDir()。/config/租户/config.'.$this->getEnvironment()。.yml')
我不知道这是否是一个好的做法,但它的工作很好 这里有几种可能性 如果租户的编号为常量或接近常量(很少添加新租户),您只需按照说明设置多个连接即可。之后,您可以通过调用
$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));
}
}
这里有几种可能性
如果租户的编号为常量或接近常量(很少添加新租户),您只需按照说明设置多个连接即可。之后,您可以通过调用
$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));
}
}
谢谢@Andrey。我正在寻找将symfony上的“登录”命令发送到正确的数据库。我有许多数据库(每个租户一个),但当用户登录symfony时,数据库的顺序将在parameters.yml上对数据库进行定义。我只是想在用户登录symfony之前,通过域加载正确的paratemers.yml。(对不起,我的英语:/)@CarlosCarmona-听起来您需要根据请求使用不同的parameter.yml?不会发生的。所有的配置工作都完成一次,然后缓存。对于每个请求,它总是相同的。您将需要执行以下回答所建议的操作。@Andrey我解决了这个问题,在(app/config/tenantX)的不同文件夹中安排不同的租户配置,并按域按appKernel de corret environment加载。它很好用!!:)@祝贺你!谢谢你,安德烈。我正在寻找将symfony上的“登录”命令发送到正确的数据库。我有许多数据库(每个租户一个),但当用户登录symfony时,数据库的顺序将在parameters.yml上对数据库进行定义。我只是想在用户登录symfony之前,通过域加载正确的paratemers.yml。(对不起,我的英语:/)@CarlosCarmona-听起来您需要根据请求使用不同的parameter.yml?不会发生的。所有的配置工作都完成一次,然后缓存。对于每个请求,它总是相同的。您将需要执行以下回答所建议的操作。@Andrey我解决了这个问题,在(app/config/tenantX)的不同文件夹中安排不同的租户配置,并按域按appKernel de corret environment加载。它很好用!!:)@祝贺你!如果您想使用条令迁移,您将遇到问题,因为它独立于此配置。我有一个解决方案,如果您想访问doctrine migrations,您可以在这里阅读,我要感谢您,因为您为我指明了使用多个数据库和同一个源的正确方向;-)我认为您上面描述的kernelApp.php
方法将缓存您的配置。例如:如果加载了tenata
config,它也将被缓存并加载到tenantB
中。。(承认post已经3岁了!)如果您想使用条令迁移,您会遇到问题,因为它独立于此配置。我有一个解决方案,如果您想访问doctrine migrations,您可以在这里阅读,我要感谢您,因为您为我指明了使用多个数据库和同一个源的正确方向;-)我认为您上面描述的kernelApp.php
方法将缓存您的配置。例如:如果加载了tenata
config,它也将被缓存并加载到tenantB
中。。(承认职位已满3岁!)