1

我正在尝试使用 MongoDB 来存储我的会话,并且我需要获取对\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 添加到日志的记录器预处理器冲突,我认为这与会话有关。

有任何想法吗?

4

1 回答 1

5

查看Doctrine\MongoDB\Connection的源代码,该getMongo()方法仅返回$mongo类属性,该属性可能已初始化,也可能未初始化。如果可能,您可以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

这将调用从其工厂方法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 别名。不过,切换到新前缀是明智的。
于 2012-09-10T17:31:53.167 回答