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

Sco*_* R. 11 doctrine symfony

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

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

我们希望为Client表使用一个Doctrine实体,然后根据其帐户的URL动态查找其数据库凭据.

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

我想建议合作整理一个有效的解决方案,我将为其他想要在Symfony中修改数据库连接参数的人们整理一篇博客/教程帖子.

以下是一些相关帖子:

动态数据库连接symfony2

Symfony2,动态数据库连接/ Doctrine服务的早期覆盖

谢谢!

Mic*_*ipa 16

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

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

$new = \Doctrine\ORM\EntityManager::create(
    $conn,
    $em->getConfiguration(),
    $em->getEventManager()
);
Run Code Online (Sandbox Code Playgroud)


Pau*_*xon 9

我需要做类似的事情 - 运行时发现可用的数据库服务器.我通过覆盖doctrine.dbal.connection_factory.class参数并用我自己派生的Doctrine包的ConnectionFactory类来代替它

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

parameters:
     doctrine.dbal.connection_factory.class: Path\To\Class\CustomConnectionFactory
Run Code Online (Sandbox Code Playgroud)

然后在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);
    }

}
Run Code Online (Sandbox Code Playgroud)

另请注意,Symfony 3.2能够在容器配置中使用环境变量,并按需使用它们的值(而不是在编译容器时修复它们).有关详细信息,请参阅博客公告.