Динамически привязать компонент к соединению

У меня есть веб-сайт Symfony, который можно просматривать в двух разных контекстах. Я имею в виду контексты, а не приложения (я использую ysfDimensionsPlugin). В первом контексте я аутентифицирую пользователей с помощью sfGuard, привязанного к базе данных db1; во втором контексте я аутентифицирую пользователей с помощью 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');

Поэтому я спрашиваю: как бы вы это реализовали, чтобы это решить?


person Gregoire    schedule 05.01.2012    source источник


Ответы (1)


Я не уверен, но вы можете попробовать это. Сохраните аргументы привязки в файле (yml или json). Привязка будет происходить на основе аргументов (переменных) в файле. Если он содержит 2, то привяжите оба, иначе привяжите тот, который присутствует в файле.

например, у вас есть файл json

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

И в app.yml

all:
  bind: context1

Вы читаете app.yml и привязываетесь к аргументам контекста в файле json. Предположим, что значение привязки в app.yml равно context1. Затем вы свяжете sfGuardUser с db1 в вашей функции preExecute.

Вы можете динамически изменять значения app.yml, используя

sfConfig::set('app_bind',"context2");
person Arasu    schedule 05.01.2012
comment
Извините, но я не понимаю, что вы имеете в виду. Не могли бы вы быть более явным? - person Gregoire; 06.01.2012
comment
Как я уже сказал, проблема в том, что вызов bindComponent(), который я делаю в моем preExecute, перезаписывается автозагрузчиком. - person Gregoire; 07.01.2012
comment
Я думаю, вам нужно удалить bindComponent в базовом классе sfGuard, который перезаписывает bindComponent. - person Arasu; 07.01.2012