La documentation de Symfony est assez vague à ce sujet, comment gérer plusieurs base de données avec Symfony ?
Nous allons étudier un cas pratique, on dispose de deux base de données MySQL (la procédure peut cependant être étendu aux autres SGBD compatible) appelées base1 et base2. Ces deux bases de données contiennent toutes deux des tables matérialisées par ce schéma :
- Base de données : base1
- Table : user1
- Table : test1
- Base de données : base2
- Table : user2
- Table : test2
Le livre Symfony nous dit :
You can have more than one schema per application. Symfony will take into account every file ending with schema.yml or schema.xml in the config/ folder. If your application has many tables, or if some tables don't share the same connection, you will find this approach very useful
En simple, il est possible d'avoir plusieurs schemas de base de données dans le répertoire config à condition que le nom de ces derniers se termine par schema.yml ou schema.xml
Il est donc possible d'utiliser un schema par base de données avec un identifiant de connexion différent par schéma.
Il faut donc créer un schéma représentatif des tables par base de données et il faut que le nom de ces schémas se termine par schema.yml ou schema.xml
La génération des schémas ne sera pas traitée dans cet article, cet article suppose que le schéma des tables de la base1 se trouve dans le fichier base1-schema.xml et pour la base2 dans le fichier base2-schema.xml (les fichiers peuvent être en yaml ou xml peut importe..)
Une fois que les schémas sont crées, il faut maintenant leur donner un identifiant de connexion, comment ?
En Yaml c'est la première ligne qui détermine l'identifiant qui sera utilisé (décrit dans le fichier database.yml, nous verrons plus tard)
En XML c'est l'attribut name de la balise database
Après avoir définit les schémas avec les identifiants de connexion appropriés, il faut définir ces derniers dans le fichier config/databases.yml pour chaque identifiant de connexion vous devez créer un paragraphe dans l'espace de nom all portant le nom de ce dernier.
Chaque identifiant doit contenir au moins 2 informations :
- La class à utiliser pour gérer la base de données (par defaut sfPropelDatabase)
- Un sous espace de nom contenant l'attribut dsn permettant de spécifier l'adresse du serveur, le protocole à utiliser, l'utilisateur à choisir ainsi que le mot de passe sous la forme
protocole://utilisateur:mot de passe@adresse du serveur/base de données à utiliser
Ce qui donnera dans notre exemple, en supposant que nous utilisons MySQL en local avec l'user toto et le mot de passe azerty et que nous voulons sélectionner la base1 :
mysql://toto:azerty@localhost/base1
Voici un fichier databases.yml conforme avec notre exemple de départ :
all:
base1:
class: sfPropelDatabase
param:
dsn: mysql://root@localhost/base1
base2:
class: sfPropelDatabase
param:
dsn: mysql://root@localhost/base2
Vous l'aurez compris les identifiants de base de données sont ici base1 et base2
Vous devez maintenant vider le cache symfony pour prendre en compte les modifications (symfony cc dans un shell) Et vous pouvez utiliser la fameuse fonction symfony propel-build-model pour construire les class définit grâce aux fichiers schémas.