Динамически привязывать компонент к соединению - PullRequest
0 голосов
/ 05 января 2012

У меня есть веб-сайт Symfony, который можно просматривать в двух разных контекстах.Я имею в виду контексты, а не приложения (я использую ysfDimensionsPlugin ).В первом контексте я аутентифицирую пользователей, используя sfGuard, связанный с базой данных db1;во втором контексте я аутентифицирую пользователей, используя sfGuard, но привязанный к базе данных db2.

Эти 2 соединения определены в database.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 голосов
/ 05 января 2012

Я не уверен, но ты можешь попробовать это. Сохраните обязательные аргументы в файле (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");
...