我已经使用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;
}
答案 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
有任何问题请告诉我。