如何在Doctrine ODM和MongoDbSessionHandler之间共享\ Mongo实例?

Cho*_*per 1 php dependency-injection mongodb symfony doctrine-odm

我正在尝试使用MongoDB来存储我的会话,我需要获得对该\Mongo实例的引用.

但显然它并未被宣布为服务.相反,doctrine在包装器中创建它.

那我该怎么办呢?我试过这个:

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
Run Code Online (Sandbox Code Playgroud)

但有时它返回null,它也与我的logger预处理器冲突,后者将request_id添加到日志中,我认为这与会话有关.

有任何想法吗?

jmi*_*ola 5

查看Doctrine\MongoDB\Connection的源代码,该getMongo()方法只返回$mongoclass属性,可以初始化也可以不初始化.如果可能,您可以initialize()在注入连接之前手动调用.鉴于您已经为Connection包装器定义了一个服务,您应该能够这样做:

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
Run Code Online (Sandbox Code Playgroud)

这将调用从其工厂方法initialize()构造mongo.connection服务的容器与返回它之间的方法.

还需注意以下几点:

  1. 如果mongo.connection只使用一次(注入mongo),您可能更喜欢使用匿名服务定义来代替定义另一个服务.
  2. ODM捆绑已经将每个连接定义为doctrine_mongodb.odm.%s_connection,使用其配置中的名称代替%s; 但是,如果需要向服务定义添加方法调用,则无效.
  3. 最新版本的ODM捆绑包(对于Symfony 2.1+)将其服务前缀从更改doctrine.odm.mongodbdoctrine_mongodb.odm,尽管默认文档管理器存在BC别名.不过,切换到新的前缀是明智的.