首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony 3-使用多个数据库连接的EntityManager依赖注入

Symfony 3-使用多个数据库连接的EntityManager依赖注入
EN

Stack Overflow用户
提问于 2017-03-27 16:49:45
回答 3查看 3.6K关注 0票数 4

我已经使用guard设置了一个自定义验证器,并自动连接了服务。这是经过测试的,只需配置MySQL即可正常工作。

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

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

代码语言:javascript
复制
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配置

代码语言:javascript
复制
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类中的构造函数

代码语言:javascript
复制
 private $formFactory;

    private $em;

    private $router;


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

回答 3

Stack Overflow用户

发布于 2017-08-15 02:06:54

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

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

代码语言:javascript
复制
namespace MyBundle\Service\Database;

use Doctrine\ORM\Decorator\EntityManagerDecorator;

class PrismEntityManager extends EntityManagerDecorator {}

class BaanEntityManager extends EntityManagerDecorator {}

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

代码语言:javascript
复制
MyBundle\Service\Database\PrismEntityManager:
    arguments:
        $wrapped: '@doctrine.orm.prism_entity_manager'

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

现在,您只需为其中一个服务键入提示。

代码语言:javascript
复制
public function __construct(FormFactoryInterface $formFactory, PrismEntityManager $em, RouterInterface $router)
{
    $this->formFactory = $formFactory;
    $this->em = $em;
    $this->router = $router;
}
票数 10
EN

Stack Overflow用户

发布于 2017-03-27 17:13:27

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

代码语言:javascript
复制
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

现在,您可以使用doctrine.orm.custom_entity_manager传递您的自定义EntityManager。

票数 2
EN

Stack Overflow用户

发布于 2017-10-03 04:52:51

我想,我在DBAL连接方面遇到了与EntityManager相同的问题。我已经用一些代理类解决了这个问题--在下面的回答中描述:https://stackoverflow.com/a/46265170/6357312

任何问题都可以让我知道。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43041832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档