PrestaConcept
Nos réalisations
Nos métiers
  • Découvrez nos métiers
  • Développement web sur mesure

    Nous développons en méthode agile des back sous le framework PHP Symfony, des front en Angular.

  • Maintenance d'applications

    Maintien en condition opérationnelle de votre plateforme Symfony.

  • Expertise Symfony

    Coaching, formation, audit et conseil.

  • Hébergement et Infogérance

    Une expertise de l'hébergement depuis plus de 15 ans et l’infogérance de centaines de machines en production actuellement.

  • Qui sommes nous
  • Découvrez Prestaconcept
  • PrestaConcept

    Notre histoire, nos convictions, notre vision... Découvrez ce qui nous anime !

  • L'équipe

    Plus de 15 ans minimum d'expérience sur Symfony.

  • Nos engagements RSE

    Une société engagée pour un numérique responsable.

  • Nos convictions

    Co-construction, transparence.. Les principes qui guident nos collaborations !

  • Nous rejoindre

    Envie de nous rejoindre ? Consultez nos offres !

  • Blog
    J'ai un projet Nous contacter
    J'ai un projet Nous contacter Menu
    • Accueil
    • Blog
    • Tech
    • Travailler avec plusieurs connexions Doctrine

    Blog

    Travailler avec plusieurs connexions Doctrine

    doctrine php symfony
    Yann Eugoné
    Yann Eugoné CTO
    Publié le jeudi 5 octobre 2017

    Astuces lorsqu'on travaille avec plusieurs connexions Doctrine dans un seul et même projet.

    Travailler avec plusieurs bases de données dans un même projet n'arrive pas tous les jours.

    Ce billet trace quelques astuces qui vous permettront probablement de gagner un peu de temps lorsque vous y serez confrontés.

    Déclarer qui s'occupe de qui

    C'est la première chose à faire lorsque vous utilisez plusieurs sources de données : dire à Doctrine sur quelle connexion il est censé mapper vos entités.

    C'est ce que fait pour vous l'auto_mapping lorsque vous n'avez qu'une seule base de données.

    Toutes les entités d'un même bundle ne pourront être gérées que par une seule connexion. Une connexion peut gérer les entités de plusieurs bundles.

    Structure des bundles et des entités :

    AppBundle
        > Entity
            > Product.php
    
    WarehouseBundle
        > Entity
            > Stock.php
    
    doctrine:
        dbal:
            default_connection: default
            connections:
                default:
                    # ...
                warehouse:
                    # ...
        orm:
            default_entity_manager: default
            entity_managers:
                default:
                    connection: default
                    mappings:
                        AppBundle: ~
                external:
                    connection: warehouse
                    mappings:
                        WarehouseBundle: ~
    

    Récupérer le bon manager

    Même si vous pouvez demander le manager en direct, en connaissant la façon dont l'id du service est construit par Symfony (doctrine.orm.{name}_entity_manager), c'est une pratique fortement déconseillée, car elle ne tient pas compte de la configuration.

    Le registre doctrine permet d'abstraire cette configuration.

    <?php
    
    namespace AppBundle\Controller;
    
    use AppBundle\Entity\Product;
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Warehouse\Entity\Stock;
    
    class CartController extends Controller
    {
        public function indexAction()
        {
            $productManager = $this->getDoctrine()->getManagerForClass(Product::class);
            $productRepository = $this->getDoctrine()->getRepository(Product::class);
    
            $stockManager = $this->getDoctrine()->getManagerForClass(Stock::class);
            $stockRepository = $this->getDoctrine()->getRepository(Stock::class);
        }
    }
    

    Event listeners/subscribers sélectifs

    Lorsque vous enregistrez un event listener/subscriber Doctrine, il est actif pour toutes les connections.

    Ce qui peut poser problème si vous faites ce genre choses :

    services:
        app.event_listener.updated_at:
            class: AppBundle\Event\Listener\UpdatedAtListener
            tags:
                - { name: doctrine.event_listener, event: onFlush }
    
    <?php
    
    namespace AppBundle\Event\Listener;
    
    use AppBundle\Entity\Product;
    use Doctrine\ORM\Event\OnFlushEventArgs;
    
    class UpdatedAtListener
    {
        public function onFlush(OnFlushEventArgs $eventArgs)
        {
            $entityManager = $eventArgs->getEntityManager();
    
            $products = $entityManager->getRepository(Product::class)->findAll();
        }
    }
    
    <?php
    $stock = $stockRepository->findForProduct($product);
    $stock->setValue($stock->getValue() - 10);
    $stockManager->flush();
    

    Le service UpdatedAtListener s'attend à faire quelque chose sur les produits lors du flush. Mais il a été enregistré pour toutes les connexions.

    Dans ce cas précis, $stockRepository n'a aucune connaissance de l'entité Product, une exception sera levée pour cela.

    La solution est simple, il suffit de déclarer que l'event listener n'est valable que pour la connexion default.

    services:
        app.event_listener.updated_at:
            class: AppBundle\Event\Listener\UpdatedAtListener
            tags:
                - { name: doctrine.event_listener, event: onFlush, connection: default }
    

    Blog

    Pour continuer votre lecture ...

    Tech

    Utilisation de Stopwatch et WebProfiler dans Symfony

    Par Yann Eugoné 09/11/2023

    Comment utiliser le composant Stopwatch et le WebProfilerBundle pour détecter les lenteurs de vos applications.

    Lire la suite
    Tech

    Le pattern Décorateur avec Symfony

    Par Yann Eugoné 16/03/2022

    Apprenez à découper votre code devenu trop complexe avec le pattern décorateur, en vous aidant de Symfony.

    Lire la suite
    Tech

    Comment désactiver certains listeners lors de certaines commandes

    Par Yann Eugoné 11/01/2022

    Une solution simple et élégante, utilisant l'injection de services tagués, pour vous donner la possibilité de désactiver certains listeners lors de l'exécution de certaines commandes.

    Lire la suite

    Vous avez un projet Laravel ?

    Nous sommes spécialisés en Symfony, et grâce à Web^ID, l’agence sœur du groupe Agile Invest, nous couvrons aussi toute l’expertise Laravel.

    Découvrir Web^ID

    Une question, un projet ?
    Planifiez un échange avec nous !

    Choisissez votre date
    PrestaConcept - Groupe Agile Invest
    5, imp. Morel, 69003 Lyon +33 (0)4 78 54 45 45
    Suivez-nous
    Ecoindex B

    Ce site internet est un site basse consommation. En savoir plus sur l'Ecoindex

    Nos réalisations

  • Logiciel de mise en conformité réglementaire
  • Application de suivi de production des centrales éoliennes
  • Outil d'aide à la décision
  • Portail client
  • Nos métiers

  • Développement sur-mesure
  • Reprise d'application Symfony
  • Expertise Symfony
  • Hébergement & Infogérance
  • Qui sommes-nous

  • PrestaConcept
  • Groupe Agile Invest
  • L'équipe
  • Engagement RSE
  • Blog

  • Tech
  • Méthodologie
  • PrestaConcept
  • RSE
  • © 2025 PrestaConcept
    Mentions légales Politique de confidentialité 🍪
    Retour en haut de page