动态地将组件绑定到连接

发布于 2024-12-24 17:38:28 字数 922 浏览 3 评论 0原文

我有一个 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');

所以我问: 你会怎么做实施它来解决这个问题?

I have a symfony web site that can be browsed in two different contexts. I mean contexts, not applications (I use ysfDimensionsPlugin). In the first context, I authenticate the users using sfGuard bound to a database db1; in the second context, I authenticate the users using sfGuard but bound to a database db2.

Those 2 connections are defined in databases.yml as standard sfDoctrineDatabase objects. In schema.yml, I bind the sfGuard components to the db1 connection. So in my sfGuard base classes, I have this:

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

What I try to do is to dynamically bind the sfGuard components to the db2 connection if I am in the second context. So in a global preExecute method, I do this:

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

The binding is made, but it is immediately overwritten when a query is made: sfAutoload loads the sfGuard classes, including the base classes, calling this:

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

So I'm asking: how would you implement that to work it out?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

酷炫老祖宗 2024-12-31 17:38:28

我不确定,但你可以试试这个。将绑定参数存储在文件(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");

I'm not sure but u can try this. Store the binding arguments in a file(yml or json). The binding will happen based on the arguments(variables) in the file. If it contains 2 then bind both else bind the one present in the file.

for eg you have a json file

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

And in app.yml

all:
  bind: context1

You read the app.yml and bind to the context arguments in the json file.
Suppose bind value in app.yml is context1. Then you will bind sfGuardUser with db1 in your preExecute function.

You can change the app.yml values dynamically by using

sfConfig::set('app_bind',"context2");
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文