Symfony2 - 运行时的动态Doctrine数据库连接

时间:2013-12-27 18:10:38

标签: symfony doctrine

我正在寻找一个很好的解决方案,利用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

谢谢!

2 个答案:

答案 0 :(得分:15)

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

$conn = array(
    'driver'   => 'pdo_mysql',
    'user'     => 'root',
    'password' => '',
    'dbname'   => 'foo'
);

$new = \Doctrine\ORM\EntityManager::create(
    $conn,
    $em->getConfiguration(),
    $em->getEventManager()
);

答案 1 :(得分:8)

我需要做类似的事情 - 运行时发现可用的数据库服务器。我是通过覆盖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