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