2012-09-08 2 views
1

MongoDB를 사용하여 세션을 저장하려고하는데 \Mongo 인스턴스에 대한 참조를 가져와야합니다.Doctrine ODM과 MongoDbSessionHandler간에 Mongo 인스턴스를 공유하는 방법은 무엇입니까?

하지만 분명히 서비스로 선언되지 않았습니다. 대신, 교리는 래퍼에서 그것을 만듭니다.

그럼 어떻게해야합니까? 나는이 시도 :

services: 
    mongo.connection: 
     class: MongoDoctrine\MongoDB\Connection 
     factory_service: doctrine.odm.mongodb.document_manager 
     factory_method: getConnection 
    mongo: 
     class: Mongo 
     factory_service: mongo.connection 
     factory_method: getMongo 

을하지만 경우에 따라서는 null을 반환하고, 그것은 또한 내가 세션과 함께 할 수있는 뭔가가 생각하는 로그에 REQUEST_ID을 추가 내 로거 처리기와 충돌.

아이디어가 있으십니까?

답변

5

Doctrine\MongoDB\Connection의 출처에서 보면 getMongo() 메서드는 $mongo 클래스 속성을 반환하기 만합니다.이 속성은 초기화 될 수도 있고 초기화되지 않을 수도 있습니다. 가능한 경우 연결을 삽입하기 전에 수동으로 initialize()으로 전화 할 수 있습니다. 이미 연결 래퍼에 대한 서비스를 정의하고 있음을 감안할 때, 당신은이 작업을 수행 할 수 있어야한다 :

services: 
    mongo.connection: 
     class: Doctrine\MongoDB\Connection 
     factory_service: doctrine.odm.mongodb.document_manager 
     factory_method: getConnection 
     calls: 
      - [initialize, []] 
    mongo: 
     class: Mongo 
     factory_service: mongo.connection 
     factory_method: getMongo 
공장 방법에서 mongo.connection 서비스를 구성하는 용기 사이의 initialize() 메소드를 호출 할

그것은 반환 .

일부 추가 점을주의해야 : 전용 (mongo 주입에) 한 번 사용하는 것입니다

  1. mongo.connection 경우 다른 서비스를 정의하는 대신에 익명의 서비스 정의를 사용하여 선호 할 수 있습니다.
  2. ODM 번들은 이미 각 연결을 %s 대신 구성의 이름을 사용하여 doctrine_mongodb.odm.%s_connection으로 정의합니다. 그러나 서비스 정의에 메소드 호출을 추가해야하는 경우에는 도움이되지 않습니다.
  3. ODM 번들 (Symfony 2.1+)의 최신 버전은 doctrine.odm.mongodb에서 doctrine_mongodb.odm으로 변경되었으며, 기본 문서 관리자에 대한 BC 별칭이 존재합니다. 새로운 접두사로 전환하는 것이 현명 할 것입니다.
+0

전 처리기를 사용하여 모노 그래프를 사용할 때 여전히 순환 참조를 얻지 만 작동합니다. – ChocoDeveloper

+0

자, 이제 SessionRequestProcession에'@service_container'를 주입하여'@ session'을 주입하는 대신이 문제를 해결했습니다. 이 방법은 필요할 때까지 인스턴스화되지 않습니다. 그때까지는 이미 존재할 것이고 순환 참조를 피할 것입니다. 나는 우리가 컨테이너를 주입하지 않아도된다는 것을 안다.하지만 우리가 사용할 수 있도록 Mongo를 서비스로 선언하지 않는다면 다른 해결책은 보이지 않는다. – ChocoDeveloper

+1

올바르게 이해하면 Connection 서비스가 Monolog에 따라 옵션으로 제공됩니까? 순환 참조의 경우 컨테이너를 주입하고 지연 참조가 필요하지 않은 서비스를 반입하는 것은 완벽합니다. Symfony2는 필요에 따라 여러 핵심 클래스에서 내부적으로이를 수행합니다. – jmikola

관련 문제