将组件动态绑定到连接

时间:2012-01-05 09:21:10

标签: symfony1 doctrine symfony-1.4 doctrine-1.2 sfguard

我有一个symfony网站,可以在两个不同的环境中浏览。我的意思是上下文,而不是应用程序(我使用ysfDimensionsPlugin)。在第一个上下文中,我使用绑定到数据库db1的sfGuard对用户进行身份验证;在第二个上下文中,我使用sfGuard对用户进行身份验证,但绑定到数据库db2。

这两个连接在databases.yml中定义为标准sfDoctrineDatabase对象。在schema.yml中,我将sfGuard组件绑定到db1连接。所以在我的sfGuard基类中,我有这个:

Doctrine_Manager::getInstance()->bindComponent('sfGuardUser', 'db1');

我尝试做的是如果我在第二个上下文中,则将sfGuard组件动态绑定到db2连接。所以在全局preExecute方法中,我这样做:

Doctrine_Manager::getInstance()->bindComponent('sfGuardUser', 'db2');
Doctrine_Manager::getInstance()->bindComponent('sfGuardGroup', 'db2');

进行绑定,但在进行查询时会立即覆盖:sfAutoload加载sfGuard类,包括基类,调用它:

Doctrine_Manager::getInstance()->bindComponent('sfGuardUser', 'db1');

所以我问:你将如何实现它?

1 个答案:

答案 0 :(得分:0)

我不确定,但你可以尝试一下。将绑定参数存储在文件(yml或json)中。绑定将基于文件中的参数(变量)发生。如果它包含2,那么绑定其他绑定文件中存在的那个。

例如你有一个json文件

{
    "context1": {
        "db1": [
            "sfGuardUser"
        ]
    },
    "context2": {
        "db2": [
            "sfGuardUser",
            "sfGuardGroup"
        ]
    }
}

在app.yml

all:
  bind: context1

您阅读app.yml并绑定到json文件中的上下文参数。 假设app.yml中的绑定值是context1。然后,您将在preExecute函数中将sfGuardUser与db1绑定。

您可以使用

动态更改app.yml值
sfConfig::set('app_bind',"context2");