Я работаю над веб-приложением, которое будет широко использовать методы 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);
Я чувствую, что эта проблема должна была уже решаться или обсуждаться раньше ... но я не нахожу много ресурсов в Интернете. Кажется ли это разумным решением?