【问题标题】:Symfony: It's possible load different parameters.yml?Symfony:可能加载不同的parameters.yml?
【发布时间】:2017-05-31 00:57:51
【问题描述】:

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的加载器:

$loader->load($this->getRootDir().'/config/TENANT/config_'.$this->getEnvironment().'.yml');

我不知道这是否是一个好习惯,但效果很好!

【问题讨论】:

  • 如果你想使用学说迁移,你会遇到问题,因为它独立于这个配置。我有一个解决方案,如果你想进行学说迁移,你可以在这里阅读,我要感谢你,因为你为我指出了使用多个数据库和相同源的正确方向 ;-) stackoverflow.com/questions/45633339/…
  • 我认为你上面描述的kernelApp.php 方法会缓存你的配置。例如:如果tenantA 配置被加载,它将被缓存并为tenantB 加载......(承认帖子已经3岁了!)

标签: symfony parameters multi-tenant saas


【解决方案1】:

这里有几种可能性。

如果租户的数量是一个常量或接近它(很少添加新租户),您可以简单地设置几个连接,如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));
    }
}

【讨论】:

  • 谢谢@Andrey。我正在寻找正确的数据库的 symfony 上的“登录”命令。我有很多数据库(每个租户一个),但是当用户登录 symfony 时,命令会攻击在 parameters.yml 上定义的数据库。只是我正在寻找在用户登录 symfony 之前按域加载正确的 paratemers.yml。 (对不起我的英语:/)
  • @CarlosCarmona - 听起来您想要根据请求使用不同的 parameter.yml?不会发生。所有配置内容都完成一次,然后缓存。对于每个请求,它总是相同的。您将需要执行此答案建议的操作。
  • @Andrey 我解决了它在 (app/config/tenantX) 的不同文件夹中安排不同租户配置,由 appKernel de corret 环境按域加载。它工作正常! :)
  • @CarlosCarmona 恭喜!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多