2017-03-27 66 views
0

我已經使用警衛和自動連接服務設置了自定義驗證器。這已經過測試,只需配置MySQL即可正常工作。Symfony 3 - 多個數據庫連接的EntityManager依賴注入

我已經指定了第二個數據庫連接(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 

這裏是我的驗證器類的構造函數

private $formFactory; 

    private $em; 

    private $router; 


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

簡單。不要使用autowire。我認爲實際上可能有一個解決方法(查看文檔),但爲什麼添加更多的魔法。 – Cerad

回答

1

我不知道如果我理解正確的話您的問題或不是,但您可以爲不同的數據庫連接設置不同的配置,如下所示:

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。

+0

我已將我的教義配置和類構造函數添加到問題中。如何在我的類構造函數中將「棱鏡」配置傳遞給$ em? – PrestonDocks

+0

您可以將您的課程註冊到服務中,然後傳遞'@ doctrine.orm.prism_entity_manager'作爲參數。 –

+0

只要讓我知道它是否適合你?在此先感謝:) –

1

您可以擴展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; 
}