我正在使用Silex框架编写PHP应用程序。我正在使用Doctrine服务提供商,我可以正常打开连接:
$app->register(new Silex\Provider\DoctrineServiceProvider(), array(
'dbs.options' => array (
'localhost' => array(
'driver' => 'pdo_mysql',
'host' => 'localhost',
'dbname' => 'test',
'user' => 'root',
'password' => 'root',
'charset' => 'utf8',
)
),
));
完美无缺。我现在想要的是在我的代码中添加另一个数据库连接。我知道我可以在dbs.options中添加另一个元素,但之后我想在控制器中执行它(因为不同的控制器将使用不同的数据库连接)。
这可能吗?我想我可以使用DriverManager::getConnection($options, $config, $manager);
这样的东西,但可能有更好的方法。
谢谢!
答案 0 :(得分:2)
$conn = DriverManager::getConnection($params, $config);
这是生成新连接的原始代码,所以你写的是好的
答案 1 :(得分:2)
您可以使用与Silex捆绑的DoctrineServiceProvider
配置多个数据库连接。
将db.options
替换为一系列配置,其中键是连接名称和值配置选项。
$app->register(new Silex\Provider\DoctrineServiceProvider(), array(
'dbs.options' => array (
'mysql_read' => array(
'driver' => 'pdo_mysql',
'host' => 'mysql_read.someplace.tld',
'dbname' => 'my_database',
'user' => 'my_username',
'password' => 'my_password',
'charset' => 'utf8',
),
'mysql_write' => array(
'driver' => 'pdo_mysql',
'host' => 'mysql_write.someplace.tld',
'dbname' => 'my_database',
'user' => 'my_username',
'password' => 'my_password',
'charset' => 'utf8',
),
),
));
访问控制器中的多个连接:
$app->get('/blog/{id}', function ($id) use ($app) {
$sql = "SELECT * FROM posts WHERE id = ?";
$post = $app['dbs']['mysql_read']->fetchAssoc($sql, array((int) $id));
$sql = "UPDATE posts SET value = ? WHERE id = ?";
$app['dbs']['mysql_write']->executeUpdate($sql, array('newValue', (int) $id));
return "<h1>{$post['title']}</h1>".
"<p>{$post['body']}</p>";
});