Ver índice de contenidos del libro

A.1. DoctrineServiceProvider

El proveedor DoctrineServiceProvider integra la librería DBAL del proyecto Doctrine para facilitar el acceso a las bases de datos.

Nota Por el momento este proveedor solo integra el componente DBAL y no el ORM de Doctrine.

A.1.1. Parámetros de configuración

El proveedor define los siguientes parámetros configurables:

  • db.options: es un array que define cada una de las opciones del DBAL de Doctrine. Actualmente este array puede contener cualquiera de las siguientes opciones:
    • driver: indica el tipo de base de datos utilizada. Por defecto su valor es pdo_mysql, pero también admite los siguientes valores: pdo_mysql, pdo_sqlite, pdo_pgsql, pdo_oci, oci8, ibm_db2, pdo_ibm y pdo_sqlsrv.
    • dbname: el nombre de la base de datos a la que se conecta la aplicación.
    • host: el host o servidor donde se encuentra la base de datos. Su valor por defecto es localhost.
    • port: solo se tiene en cuenta para los drivers pdo_mysql, pdo_pgsql y pdo_oci/oci8. Especifica el puerto que debe usarse para conectarse a la base de datos.
    • user: el nombre de usuario utilizado para conectar con la base de datos. Su valor por defecto es root.
    • password: la contraseña utilizada para conectar con la base de datos.
    • charset: especifica el juego de caracteres utilizado al conectar con la base de datos. Solo se emplea cuando el driver es pdo_mysql, pdo_oci o oci8,
    • path: indica la ruta hasta la base de datos SQLite y por tanto, solo se tiene en cuenta cuando el driver es pdo_sqlite.

Estas y otras opciones se explican con detalle en la documentación sobre la configuración del DBAL de Doctrine.

A.1.2. Servicios proporcionados

El proveedor proporciona los siguientes servicios:

  • db: se trata de la conexión con la base de datos y es una instancia de la clase Doctrine\DBAL\Connection.
  • db.config: objeto relacionado con la configuración de Doctrine. Por defecto es un objeto vacío de tipo Doctrine\DBAL\Configuration.
  • db.event_manager: proporciona acceso al event manager de Doctrine.

A.1.3. Cómo se registra el proveedor

El siguiente código muestra un ejemplo de cómo registrar este proveedor:

$app->register(new Silex\Provider\DoctrineServiceProvider(), array(
    'db.options' => array(
        'driver'   => 'pdo_sqlite',
        'path'     => __DIR__.'/app.db',
    ),
));

Nota La librería DBAL de Doctrine se incluye cuando descargas Silex en forma de archivo comprimido. Si instalas Silex mediante Composer, debes añadir esta dependencia ejecutando el siguiente comando:

$ composer require "doctrine/dbal:~2.2"

A.1.4. Ejemplos de uso

El servicio más utilizado del proveedor de Doctrine es db, que permite realizar operaciones con la base de datos, tal y como muestra el siguiente ejemplo:

$app->get('/blog/{id}', function ($id) use ($app) {
    $sql = "SELECT * FROM posts WHERE id = ?";
    $post = $app['db']->fetchAssoc($sql, array((int) $id));
 
    return  "<h1>{$post['title']}</h1>".
            "<p>{$post['body']}</p>";
});

A.1.5. Utilizando varias bases de datos

El proveedor de Doctrine permite trabajar con varias bases de datos a la vez en una única aplicación. Para ello, reemplaza el array db.options por otro array llamado dbs.options (solamente hay que añadir una letra s a la palabra db). Las claves de este nuevo array se interpretan como el nombre de las conexiones:

$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',
        ),
    ),
));

La primera conexión registrada se considera la conexión por defecto y se puede acceder como si solamente hubiera una conexión registrada. Por tanto, con la configuración anterior, estas dos líneas de código son equivalentes:

$app['db']->fetchAssoc('SELECT * FROM table');
 
$app['dbs']['mysql_read']->fetchAssoc('SELECT * FROM table');

Utilizar varias conexiones en el mismo controlador resulta muy sencillo:

$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>";
});

Si tienes dudas sobre el manejo de las bases de datos, puedes consultar la documentación del DBAL de Doctrine.