[英]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()
方法。
需要注意的其他几点:
mongo.connection
仅将使用一次(注入mongo
),则您可能更喜欢使用匿名服务定义来代替定义另一个服务。 %s
来将每个连接定义为doctrine_mongodb.odm.%s_connection
。 但是,如果您需要在服务定义中添加方法调用,那将无济于事。 doctrine.odm.mongodb
更改为doctrine_mongodb.odm
,尽管默认文档管理器存在BC别名。 不过,最好切换到新的前缀。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.