разработка поддерживаемой системы RPC

Я работаю над веб-приложением, которое будет широко использовать методы AJAX для взаимодействия клиент / сервер ... в частности, JSON-RPC. Zend Framework используется на стороне сервера, и он предлагает хороший сервер JSON-RPC, который я хотел бы использовать.

Моя цель состоит в том, чтобы спроектировать поддерживаемую систему, которая предоставляет большое подмножество серверных боковая функциональность на стороне клиента (javascript) без ненужного дублирования кода. Я видел множество сообщений в блогах и руководств по использованию ZF. s сервер JSON-RPC (см. здесь и здесь ), но все они казались ориентированными на предоставление небольшого, общедоступного API. Дублирование кода является обычным явлением, например, в одном сообщении в блоге представлен следующий метод:

public static function setTitle($bookId, $title) {
    $book = new Nickel_Model_Book($bookId);
    $book->setTitle($title);
    $book->update();
    return true;
}

Мне не нравится тот факт, что существует два метода setTitle . Если сигнатура метода для одного изменяется, другой необходимо синхронизировать ... кажется кошмаром ремонтопригодности, если ваш API обширен. Мне кажется, что должен быть один класс Book с одним методом setTitle .

Моя первоначальная мысль - добавить аннотацию docblock @export к методам / классы, которые я хочу показать. Когда я решаю открыть метод setTitle , я просто добавляю аннотацию, а не новый метод.

Одна потенциальная проблема, которую я вижу, связана с сохранением объекта. На стороне сервера для setTitle имеет смысл установить свойство title объекта ... но не сохранять его в базе данных до вызова update () . На стороне клиента вызов setTitle должен немедленно повлиять на базу данных. Одно из возможных решений - изменить все аксессоры таким образом, чтобы они принимали необязательный второй параметр, означающий, что изменение должно немедленно обновить базу данных:

function setTitle($title, $persist = false) {
    $this->title = $title;

    if ($persist) $this->update();
}

Какой-то прокси-класс может гарантировать, что флаг $ persist установлен для всех вызовы RPC на стороне клиента.

Другая проблема - сериализация объектов PHP. На стороне сервера имеет смысл выполнить вызов $ book-> setTitle ("foo") в стиле объектно-ориентированного программирования, но на стороне клиента book.setTitle (1234, "foo" ) имеет смысл (где 1234 - идентификатор книги) из-за отсутствия состояния. Моим решением было бы, чтобы вышеупомянутый прокси-класс отвечал за то, чтобы каким-то образом преобразовать book.setTitle (1234, "foo") в:

$book = new Book();
$book->load(1234);
return $book->setTitle($title);

Я чувствую, что эта проблема должна была уже решаться или обсуждаться раньше ... но я не нахожу много ресурсов в Интернете. Кажется ли это разумным решением?

13
задан Josh Johnson 22 November 2010 в 18:40
поделиться