2014-01-21 2 views
1

Я пишу PHP-приложение, используя инфраструктуру Silex. Я использую поставщик Доктрина Service, и я могу открыть соединение нормально, как это:Динамическое подключение к DBAL в Silex

$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);, но, вероятно, лучший способ это сделать.

Спасибо!

ответ

2

Вы можете настроить несколько подключения к БД с помощью DoctrineServiceProvider в комплекте с Silex.

Замените 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>"; 
}); 

Источник: http://silex.sensiolabs.org/doc/providers/doctrine.html

+0

Это не то, что просили. –

Смежные вопросы