symfonydoctrinedbal

Autowire specific DBAL connection when using multiple of them


I'm using Doctrine 2 where I have multiple connections for DBAL. I have also multiple EntityManagers in ORM.

I need to be able to somehow autowire specific DBAL connection into other Symfony 3 services.

I can autowire any EntitiyManager using EntityManagerDecorator but don't know how to do the same with connection. I'm able to get the connection from EntityManager but I don't think it's the way to go.


Solution

  • You can specify wrapper class for doctrine connections, no proxy class needed:

    #config.yml
    doctrine:
        dbal:
            connections:
                default:
                    wrapper_class: AppBundle\Connections\ConnectionDefault
                    ...
                second:
                    wrapper_class: AppBundle\Connections\ConnectionSecond
                    ...
    

    Connections should extend Doctrine\DBAL\Connection:

    <?php
    
    namespace AppBundle\Connection;
    
    use Doctrine\DBAL\Connection;
    
    class ConnectionDefault extends Connection
    {
    
    }
    
    class ConnectionSecond extends Connection
    {
    
    }
    

    and create service aliases:

    #services.yml
    services:
        ...
        AppBundle\Connections\ConnectionDefault: '@doctrine.dbal.default_connection'
        AppBundle\Connections\ConnectionSecond: '@doctrine.dbal.second_connection'
    

    then you can simply inject desired connection into service by typehinting it:

    class MyService {
        public function __construct(ConnectionDefault $connection) {...}
    }
    
    class MyOtherService {
        public function __construct(ConnectionSecond $connection) {...}
    }