如何扩展和使用MongoCursor类

时间:2015-02-02 13:58:09

标签: php mongodb

我正在尝试扩展MongoCursor类,以便在我的Mongo数据库中查询/排序/等等时做一些额外的事情。

PHP文档明确指出我可以而且应该使用doQuery()方法,因为所有查询内容都会调用此方法。甚至还有一个覆盖Cursor类的示例。所以,到目前为止没问题......

但是现在,我怎样才能让我的MongoCollection类返回这个新的MyCursor类而不是普通的MongoCursor?

http://php.net/manual/en/mongocursor.doquery.php

示例MyCursor:

class MyCursor extends MongoCursor {
    protected function doQuery() {
        // Do some custom and very special stuff here!
        MongoCursor::doQuery();
    }
}

<小时/> 一些澄清

我可以创建自己的MongoCollection类(我创建了一个Decorator,但只是Extension会起作用)。

我也可以使用我自己的代码创建自己的MongoCursor类,如上所示。

问题不在于如何创建我自己的MongoCursor类,而是如何使集合从调用find方法返回此自定义Cursor类。 Afaik,find方法当前返回一个硬编码的MongoCursor类,不能更改为返回其他内容。对游标构造函数的调用是在find方法中,不可访问。

我会把它留在那里然后回家拿啤酒并使用其他数据库,但是从PHP文档中扩展MongoCursor的示例表明有一种方法可以使用自定义光标。

1 个答案:

答案 0 :(得分:-1)

您还需要扩展课程MongoCollection(以及MongoClient)。

另一种解决方案是将原始MongoCursor封装到MyCursor中,如下例所示:

class MyCursor extends MongoCursor {

        private $baseCursor;

        protected function doQuery() {
                // Do some custom and very special stuff here!
#               MongoCursor::doQuery();
        }

        public function __construct($baseCursor=null) {
                if (!is_null($baseCursor)) {
                        $this->baseCursor = $baseCursor;
                } else {
                        $this->baseCursor = new MongoCursor($this);
                }
        }

        public function __call($name, $arguments) {
                if (in_array($name, get_class_methods('MongoCursor'))) {
                        return $this->baseCursor->$name($arguments);
                } else {
                        return $this->$name($arguments);
                }
        }
}