2012-01-05 7 views
0

두 가지 다른 상황에서 탐색 할 수있는 심포니 웹 사이트가 있습니다. 응용 프로그램이 아니라 컨텍스트를 의미합니다 (나는 ysfDimensionsPlugin을 사용함). 첫 번째 컨텍스트에서는 데이터베이스 db1에 바인딩 된 sfGuard를 사용하여 사용자를 인증합니다. 두 번째 컨텍스트에서는 sfGuard를 사용하여 사용자를 인증하지만 데이터베이스 db2에 바인딩됩니다.구성 요소를 연결에 동적으로 바인딩하기

이 두 연결은 databases.yml에서 표준 sfDoctrineDatabase 객체로 정의됩니다. schema.yml에서 sfGuard 구성 요소를 db1 연결에 바인딩합니다. 그래서 내 sfGuard 기본 클래스에서, 나는이 있습니다

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

내가 뭘하려고하는 것은 내가 두 번째 맥락에서 생각하면 동적으로 DB2 연결에 sfGuard 구성 요소를 결합하는 것입니다. 그래서 글로벌 preExecute 방법으로,이 수행

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

만들를 바인딩하지만 쿼리가 만들어 질 때 즉시 덮어 씁니다 :이 호출, sfAutoload는 기본 클래스를 포함하여 sfGuard 클래스를로드합니다

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

그래서 저는 묻습니다. 어떻게 해결할 수 있습니까?

답변

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과 바인딩합니다.

는 동적 죄송합니다

sfConfig::set('app_bind',"context2"); 
+0

를 사용하여 app.yml 값을 변경할 수 있습니다하지만 난 당신이 무슨 뜻인지 이해가 안 돼요. 당신은 더 명백 할 수 있습니까? – Gregoire

+0

@Gregoire 늦게 답변드립니다. 답변을 업데이트했습니다. – Arasu

+0

내가 말했듯이 문제는 내 preExecute에서 "bindComponent()"호출이 오토로더에 의해 덮어 쓰여진다는 것입니다. – Gregoire

관련 문제