5

我已经使用保护设置了一个自定义身份验证器并自动连接了服务。这是经过测试的,只配置了 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:
    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;
    }
4

3 回答 3

11

您可以扩展 Doctrine's ,它在其构造函数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;
}
于 2017-08-14T18:06:54.010 回答
2

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

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.

于 2017-03-27T09:13:26.713 回答
0

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

任何问题让我知道。

于 2017-10-02T20:52:51.057 回答