我正在尝试扩展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的示例表明有一种方法可以使用自定义光标。
答案 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);
}
}
}