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 espdo_mysql
, pero también admite los siguientes valores:pdo_mysql
,pdo_sqlite
,pdo_pgsql
,pdo_oci
,oci8
,ibm_db2
,pdo_ibm
ypdo_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 eslocalhost
.port
: solo se tiene en cuenta para los driverspdo_mysql
,pdo_pgsql
ypdo_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 esroot
.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 eldriver
espdo_mysql
,pdo_oci
ooci8
,path
: indica la ruta hasta la base de datos SQLite y por tanto, solo se tiene en cuenta cuando eldriver
espdo_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 claseDoctrine\DBAL\Connection
.db.config
: objeto relacionado con la configuración de Doctrine. Por defecto es un objeto vacío de tipoDoctrine\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.