Я работаю над веб-приложением, которое будет широко использовать методы AJAX для связи клиент / сервер ... JSON-RPC, в частности.Zend Framework используется на стороне сервера и предлагает хороший JSON-RPC-сервер, который я хотел бы использовать.
Моя цель - создать обслуживаемую систему, которая предоставляет подмножество большой серверной функциональности на стороне клиента (javascript), без ненужного дублирования кода.Я видел многочисленные публикации в блогах и учебные пособия о том, как использовать JSON-RPC-сервер ZF (см. здесь и здесь ), но все они, похоже, были направлены на предоставление небольшого общедоступного 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")
в стиле OO, но на стороне клиента book.setTitle(1234, "foo")
имеет смысл (где 1234 - это идентификатор книги) из-за отсутствия состояния.Мое решение для этого было бы сделать так, чтобы вышеупомянутый прокси-класс отвечал за то, чтобы как-то превратить book.setTitle(1234, "foo")
в:
$book = new Book();
$book->load(1234);
return $book->setTitle($title);
Я чувствую, что эта проблема должна быть решена или обсуждена ранее ... но яне найти много ресурсов в Интернете.Это похоже на вменяемое решение?