Symfony 3 - 具有多个数据库连接的EntityManager依赖注入

时间:2017-03-27 08:49:45

标签: symfony dependency-injection entitymanager symfony-3.2

我已经使用guard设置了一个Custom Authenticator并自动连接了该服务。这已经过测试,只需配置MySQL即可正常工作。

我现在已经指定了第二个数据库连接(oracle),但Symfony现在不允许在我的服务配置中自动装配,因为它不知道在将EntityManager注入自定义Authenticator类时要使用哪个数据库连接。

我知道如何配置依赖注入以使用特定的数据库连接,以便我可以继续使用AutoWire。

Unable to autowire argument of type "Doctrine\ORM\EntityManager" for the service "user.security.login_form_authenticator". Multiple services exist for this class (doctrine.orm.prism_entity_manager, doctrine.orm.baan_entity_manager).

这是我在config.yml中的Doctrine配置

doctrine:
    dbal:
        connections:
            prism:
                driver:   pdo_mysql
                host:     "%database_host%"
                port:     "%database_port%"
                dbname:   "%database_name%"
                user:     "%database_user%"
                password: "%database_password%"
                charset:  UTF8
                # if using pdo_sqlite as your database driver:
                #   1. add the path in parameters.yml
                #     e.g. database_path: "%kernel.root_dir%/../var/data/data.sqlite"
                #   2. Uncomment database_path in parameters.yml.dist
                #   3. Uncomment next line:
                #path:     "%database_path%"
            baan:
                driver:   oci8
                host:     "%baan_host%"
                port:     "%baan_port%"
                dbname:   "%baan_db_name%"
                user:     "%baan_user%"
                password: "%baan_password%"
                charset:  AL32UTF8

    orm:
        default_entity_manager: prism
        auto_generate_proxy_classes: "%kernel.debug%"
        entity_managers:
            auto_mapping: true
            prism:
                naming_strategy: doctrine.orm.naming_strategy.underscore
                connection: prism
                mappings:
                    UserBundle:
                        type: annotation

            baan:
                connection: baan
                mappings:
                    BaanBundle:
                        type: annotation

这是我的Authenticator类中的构造函数

 private $formFactory;

    private $em;

    private $router;


    public function __construct(FormFactoryInterface $formFactory, EntityManager $em, RouterInterface $router)
    {
        $this->formFactory = $formFactory;
        $this->em = $em;
        $this->router = $router;
    }

3 个答案:

答案 0 :(得分:6)

您可以扩展Doctrine的EntityManagerDecorator,它实现EntityManagerInterface并在其构造函数中接受EntityManager的实例。

首先为每个连接扩展EntityManagerDecorator类。

namespace MyBundle\Service\Database;

use Doctrine\ORM\Decorator\EntityManagerDecorator;

class PrismEntityManager extends EntityManagerDecorator {}

class BaanEntityManager extends EntityManagerDecorator {}

然后在您的服务配置中,您需要手动连接这两项服务。

MyBundle\Service\Database\PrismEntityManager:
    arguments:
        $wrapped: '@doctrine.orm.prism_entity_manager'

MyBundle\Service\Database\BaanEntityManager:
    arguments:
        $wrapped: '@doctrine.orm.baan_entity_manager'

现在您只需要为其中一项服务输入提示。

public function __construct(FormFactoryInterface $formFactory, PrismEntityManager $em, RouterInterface $router)
{
    $this->formFactory = $formFactory;
    $this->em = $em;
    $this->router = $router;
}

答案 1 :(得分:0)

我不知道我是否正确理解了您的问题,但您可以为不同的数据库连接设置不同的配置,如下所示:

File "........./load_library.py", line 64, in load_op_library
None, None, error_msg, error_code)
tensorflow.python.framework.errors_impl.AlreadyExistsError: 
Op with name PixelSelector

现在,您可以使用dbal: default_connection: default connections: default: driver: pdo_mysql host: "%database_host%" port: "%database_port%" dbname: "%database_name%" user: "%database_user%" password: "%database_password%" charset: UTF8 mapping_types: enum: smallint custom: driver: pdo_mysql host: '%database_host2%' port: '%database_port2%' dbname: '%database_name2%' user: '%database_user2%' password: '%database_password2%' charset: UTF8 mapping_types: enum: smallint orm: default_entity_manager: default auto_generate_proxy_classes: "%kernel.debug%" entity_managers: auto_mapping: true default: naming_strategy: doctrine.orm.naming_strategy.underscore connection: default mappings: EntityBundle: type: annotation alias: DBAlias custom: naming_strategy: doctrine.orm.naming_strategy.underscore connection: custom mappings: EntityBundle: type: annotation alias: DBAlias 传递自定义EntityManager。

答案 2 :(得分:0)

我认为,与EntityManager一样,我在DBAL Connections中遇到了同样的问题。我用一些代理类解决了这个问题 - 在这个答案中描述: https://stackoverflow.com/a/46265170/6357312

有任何问题请告诉我。