繁体   English   中英

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

[英]How to share the \Mongo instance between Doctrine ODM and MongoDbSessionHandler?

我正在尝试使用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添加到日志的记录程序预处理器冲突,我认为这与会话有关。

有任何想法吗?

查看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

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

需要注意的其他几点:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM