3

在我的可重用包中,我可以指定一个连接名称(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,当然barbar_database

我的解决方案(解决方法):

现在我正在使用事件系统对其进行更改:当捆绑中的某些内容使用Connection对象时,我会发出一个事件,即MyBundle::BAR事件。侦听器可以使用 更改连接setConnection(Connection $connection)。然后在我的包中,我使用更新的连接调用getConnection()

然而,这个解决方案迫使我监听需要更改连接的每个事件。如果我忘记收听MyBundle::FOO事件怎么办?我的应用程序无法按预期工作,并且错误将难以理解和跟踪。

有没有解决这个问题的好方法?

4

0 回答 0