Doctrine MongoDB ODM 2.x中如何获取1.x版本里Doctrine\MongoDB\Connection的等效对象?
首先得明确一个核心变化:Doctrine MongoDB ODM 2.x完全重构了底层连接实现,直接基于官方的mongodb/mongodb PHP库开发,原来的Doctrine\MongoDB\Connection类已经被移除,不再有完全同名的替代类,但你可以用官方库的原生对象来实现相同的功能。
对应不同需求的替代方案:
需要管理连接/服务器的客户端对象(对应1.x中Connection的连接管理能力):
使用getClient()方法获取MongoDB\Client实例,这就是原来Connection底层封装的客户端对象:$client = Zend_Registry::get('DocumentManager')->getClient();这个实例负责连接池管理、服务器配置等,和你1.x中
Connection里的mongoClient属性是同一个东西。需要操作具体数据库的对象(对应1.x中通过Connection获取的数据库实例):
直接调用getDatabase()获取MongoDB\Database实例:$database = Zend_Registry::get('DocumentManager')->getDatabase();如果是针对特定文档类的数据库(比如你尝试的
Model\User),getDocumentDatabase()的用法是对的,返回的也是MongoDB\Database实例,这就是你用来执行集合查询、写入操作的入口。
为什么你之前的尝试看起来不对?
你提到用getClient()和getDocumentDatabase()得到的不是"正确对象",其实是因为类名从Doctrine封装的Connection变成了官方库的原生类,但它们的功能是完全等效甚至更强大的。比如:
- 原来
Connection的server属性信息,可以通过$client->getManager()->getServers()获取; - 原来手动调用
connect()的逻辑不需要了,MongoDB\Client会自动管理连接生命周期。
如果你的旧代码依赖Doctrine\MongoDB\Connection的特定方法,需要调整为使用MongoDB\Client或MongoDB\Database的对应方法。
内容的提问来源于stack exchange,提问作者cookie

