Symfony:It';s可能加载不同的参数。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

可以在symfony上加载不同的parameters.yml吗?我有一个SaaS multitenant应用程序,我希望根据每个租户加载differents 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的加载程序:

$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岁!)