在我的可重用包中,我可以指定一个连接名称(Doctrine DBAL 连接):
# config.yml
my_bundle:
connection: ~ # or "default", or "my_connection"
在扩展中,我给它起了别名:
// MyBundleExtension.php
$container->setAlias(
'my_bundle.connection',
'doctrine.dbal.'.$config['connection'].'_connection'
);
并在需要的地方注入它(捆绑包中的 4-5 个服务)。一切正常。
不幸的是,事实证明应该(可能)在运行时更改连接,即在用户通过身份验证之后(即使用 HTTP 基本身份验证)。当用户名是foo
,然后使用 foo_database
,当然bar
后bar_database
。
我的解决方案(解决方法):
现在我正在使用事件系统对其进行更改:当捆绑中的某些内容使用Connection
对象时,我会发出一个事件,即MyBundle::BAR
事件。侦听器可以使用 更改连接setConnection(Connection $connection)
。然后在我的包中,我使用更新的连接调用getConnection()
。
然而,这个解决方案迫使我监听需要更改连接的每个事件。如果我忘记收听MyBundle::FOO
事件怎么办?我的应用程序无法按预期工作,并且错误将难以理解和跟踪。
有没有解决这个问题的好方法?