【问题标题】:Symfony2 - Dynamic Doctrine Database Connections at RuntimeSymfony2 - 运行时的动态 Doctrine 数据库连接
【发布时间】:2014-01-15 08:05:57
【问题描述】:

我正在寻找一个很好的解决方案,以利用 Doctrine 进行实体管理,在 Symfony 中实现数据库的即时连接。

我的情况是,我们服务的所有入站用户都将访问 *.website.com 地址,例如 client1.website.com。

我们想为 Client 表使用一个 Doctrine 实体,然后根据他们帐户的 URL 即时查找他们的数据库凭据。

到目前为止,我在 stackoverflow 上找到了以下讨论动态更改数据库凭据的主题,但没有明确的可行解决方案。

我想提议合作制定一个可行的解决方案,我将为其他希望在 Symfony 中修改数据库连接参数的人整理一篇博客/教程。

这里有一些相关的帖子:

Dynamic database connection symfony2

Symfony2, Dynamic DB Connection/Early override of Doctrine Service

谢谢!

【问题讨论】:

    标签: symfony doctrine


    【解决方案1】:

    我需要做一些类似的事情——运行时发现可用的数据库服务器。我通过重写 doctrine.dbal.connection_factory.class 参数并替换我自己对 Doctrine 包的 ConnectionFactory 类的推导来做到这一点

    我的 services.yml 提供了参数,指向我的自定义类

    parameters:
         doctrine.dbal.connection_factory.class: Path\To\Class\CustomConnectionFactory
    

    然后在 Path\To\Class\CustomConnectionFactory.php 中填写你的发现逻辑

    <?php
    
    namespace Path\To\Class;
    
    use Doctrine\Bundle\DoctrineBundle\ConnectionFactory;
    use Doctrine\Common\EventManager;
    use Doctrine\DBAL\Configuration;
    
    class CustomConnectionFactory extends ConnectionFactory 
    {
    
        public function createConnection(array $params, Configuration $config = null, EventManager $eventManager = null, array $mappingTypes = array())
        {
            // Discover and override $params array here.
            // A real-world example might obtain them from zookeeper,
            // consul or etcd for example. You'll probably want to cache
            // anything you obtain from such a service too.
    
            $params['driver'] = 'pdo_mysql';
            $params['host'] = '10.1.2.3';
            $params['port'] = 3306;
            $params['dbname'] = 'foo';
            $params['user'] = 'myuser';
            $params['password'] = 'mypass';
    
            //continue with regular connection creation using new params
            return parent::createConnection($params, $config, $eventManager,$mappingTypes);
        }
    
    }
    

    还要注意,Symfony 3.2 能够在容器配置中使用环境变量,并按需使用它们的值(而不是在编译容器时修复它们)。请参阅blog announcement for more details

    【讨论】:

      【解决方案2】:

      如果 $em 是现有的实体管理器并且你想重用它的配置,你可以使用这个:

      $conn = array(
          'driver'   => 'pdo_mysql',
          'user'     => 'root',
          'password' => '',
          'dbname'   => 'foo'
      );
      
      $new = \Doctrine\ORM\EntityManager::create(
          $conn,
          $em->getConfiguration(),
          $em->getEventManager()
      );
      

      【讨论】:

      • 我想要做的是永久更改所有实体用于该连接的数据库信息。看起来使用这种方法我每次使用它都会打开多个数据库连接?
      • 您可以将其实现为 Singleton,因此您将始终只获得一个实例。
      • 这对于在运行时连接到多个数据库来说非常棒——太棒了!
      • 我对 Doctrine/Symfony2 很陌生,但在其他方面是一个老黑客,所以请原谅我的失误。这个解决方案是否意味着如果我有多个数据库,所有数据库都共享相同的模式(例如,每个大型项目的不同数据集以相同的方式构造),那么一旦用户通过身份验证并创建,我就可以切换到选定的数据库他/她选择的项目???如果是这样,这正是我正在寻找的。​​span>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 2023-03-24
      相关资源
      最近更新 更多