Как расширить и использовать класс MongoCursor

0

Я пытаюсь расширить класс MongoCursor, чтобы сделать некоторые дополнительные материалы при запросе/сортировке /etc из моей базы данных Mongo.

В документации PHP четко указано, что я могу и должен использовать для этого метод doQuery(), так как все запросы, используемые 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, но как я могу заставить коллекцию вернуть этот пользовательский класс Cursor из вызова метода find. Afaik, метод find в настоящее время возвращает жесткий код MongoCursor и не может быть изменен, чтобы возвращать что-то еще. Вызов конструктора курсоров находится внутри метода find и недоступен.

Я оставил бы это на этом и просто поеду домой, возьму пиво и использую другую базу данных, но образец расширения MongoCursor из документации PHP предполагает, что есть способ использовать пользовательский курсор.

Теги:

1 ответ

-1

Вам нужно расширить класс MongoCollection (и, следовательно, MongoClient).

Другим решением было бы инкапсулировать оригинальный MongoCursor в MyCursor, 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);
                }
        }
}
  • 0
    Я сделал, но я не могу просто переопределить метод поиска, например, так как я не знаю, что он делает. И поскольку parent::find уже вернул бы MongoCursor, я не могу изменить это позже.
  • 0
    @ ToBe я отредактировал свой ответ.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню