Live geek or die tryin'

Posted on by Dinduks


Dans le cas où votre site développé avec Symfony2 utiliserait plusieurs bases de données, il faudra déclarer autant de connexions et d'Entity Managers que de bases de données.

Un Entity Manager est tout simplement l'objet permettant de sauvegarder (persist) et de récupérer (fetch) les données dans et à partir d'une base de données.


Pour illustrer mon exemple, je vais utiliser une bdd site et une autre forum.

Déclarer les connexions dans config.yml

doctrine:
  dbal:
    default_connection: site # précise la connexion utilisée par défaut
    connections:
      site:
        driver:   %database_driver%
        host:     %database_host%
        port:     %database_port%
        dbname:   site
        user:     site_usr
        password: site_pwd
        charset:  UTF8
      forum:
        driver:   %database_driver%
        host:     %database_host%
        port:     %database_port%
        dbname:   forum
        user:     forum_usr
        password: forum_pwd
        charset:  UTF8

Déclarer les EM, dans le même fichier

Tout d'abord désactivez l'auto-mapping, comme ça vous pourrez choisir quel EM va gérer les entités de quel bundle.

doctrine:
  orm:
    auto_mapping: false

Note: Si vous avez une erreur relative à cette ligne, supprimez-la carrément.

Ensuite, juste en bas, déclarez les EM en précisant les mappings avec chaque bundle.

doctrine:
  orm:
    auto_mapping: false
    default_entity_manager: web # précise l'em utilisé par défaut (lors de l'utilisation de la ligne de commande par exemple)
    entity_managers:
      web:
        connection: web
        mappings:
          DinduksMachinBundle : ~
          DinduksTrucBundle : ~
          FOSUserBundle: ~
      forum:
        connection: forum
        mappings:
          DinduksForumBundle : ~

Pour faire simple, les mappings font le lien entre un EM et les entités d'un bundle spéficique. C'est eux qui appellent, si j'ose dire, l'EM X quand on veut manipuler l'entité Y.

Attention: N'oubliez pas de toujours mapper vos bundles fraîchement créés avec un EM, sinon vous aurez un erreur de bundle inexistant lors de l'utilisation de la commande doctrine:generate:entities.

Utilisation

De la même manière que vous appelez votre EM par défaut, appelez l'EM dont vous avez besoin en prenant soin de passer son nom en paramètres à la fonction getEntityManager().

$forumEm = $this->get('doctrine')->getEntityManager('forum');

J'espère que ce tutoriel vous sera utile. A bientôt. :)

Posted on by Dinduks | Posted in Development, Symfony 2, Tutorials | Tagged , , , ,


3 Responses to Symfony2: Utiliser plusieurs bases de données

  1. manhuman says:


    Dans le cas où l’on a plusieurs bases de données ayant une structure identique, est-il possible d’utiliser une seule entitée pour se connecter aux bases?


    • Michael says:


      Très bon résumé!

      Une question cependant :
      Pourquoi devoir appeler getEntityManager avec comme argument le nom de l’em, alors qu’on fait cet appel depuis un bundle qu’on a pris soin de mapper grâce au système décrit dans ton article?
      $forumEm = $this->get('doctrine')->getEntityManager('forum');
      deviendrait
      $forumEm = $this->get('doctrine')->getEntityManager();

      ce qui permet de découpler complètement les Bundles de leur Entity Manager, et de n’avoir que de la config à modifier en cas de changement, et pas du code dans le bundle!

      Une solution?

      PS : je demande car j’ai essayé chez moi, et que ça ne marche pas : getEntityManager(); prend automatiquement l’entity manager défini par défaut, ce qui est un peu dommage. Pour moi doctrine2 ne suit pas le mapping en fait…


  2. Pingback: Symfony2: using multiple databases | Live geek or die tryin'

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>