Doctrine ======== The *DoctrineServiceProvider* provides integration with the `Doctrine DBAL <http://www.doctrine-project.org/projects/dbal>`_ for easy database access (Doctrine ORM integration is **not** supplied). Parameters ---------- * **db.options**: Array of Doctrine DBAL options. These options are available: * **driver**: The database driver to use, defaults to ``pdo_mysql``. Can be any of: ``pdo_mysql``, ``pdo_sqlite``, ``pdo_pgsql``, ``pdo_oci``, ``oci8``, ``ibm_db2``, ``pdo_ibm``, ``pdo_sqlsrv``. * **dbname**: The name of the database to connect to. * **host**: The host of the database to connect to. Defaults to localhost. * **user**: The user of the database to connect to. Defaults to root. * **password**: The password of the database to connect to. * **charset**: Only relevant for ``pdo_mysql``, and ``pdo_oci/oci8``, specifies the charset used when connecting to the database. * **path**: Only relevant for ``pdo_sqlite``, specifies the path to the SQLite database. * **port**: Only relevant for ``pdo_mysql``, ``pdo_pgsql``, and ``pdo_oci/oci8``, specifies the port of the database to connect to. These and additional options are described in detail in the `Doctrine DBAL configuration documentation <http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html>`_. Services -------- * **db**: The database connection, instance of ``Doctrine\DBAL\Connection``. * **db.config**: Configuration object for Doctrine. Defaults to an empty ``Doctrine\DBAL\Configuration``. * **db.event_manager**: Event Manager for Doctrine. Registering ----------- .. code-block:: php $app->register(new Silex\Provider\DoctrineServiceProvider(), array( 'db.options' => array( 'driver' => 'pdo_sqlite', 'path' => __DIR__.'/app.db', ), )); .. note:: Add the Doctrine DBAL as a dependency: .. code-block:: bash composer require "doctrine/dbal:~2.2" Usage ----- The Doctrine provider provides a ``db`` service. Here is a usage example:: $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>"; }); Using multiple databases ------------------------ The Doctrine provider can allow access to multiple databases. In order to configure the data sources, replace the **db.options** with **dbs.options**. **dbs.options** is an array of configurations where keys are connection names and values are 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' => 'utf8mb4', ), 'mysql_write' => array( 'driver' => 'pdo_mysql', 'host' => 'mysql_write.someplace.tld', 'dbname' => 'my_database', 'user' => 'my_username', 'password' => 'my_password', 'charset' => 'utf8mb4', ), ), )); The first registered connection is the default and can simply be accessed as you would if there was only one connection. Given the above configuration, these two lines are equivalent:: $app['db']->fetchAll('SELECT * FROM table'); $app['dbs']['mysql_read']->fetchAll('SELECT * FROM table'); Using multiple connections:: $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>"; }); For more information, consult the `Doctrine DBAL documentation <http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/>`_.