Zend_Json_Server и dojo.rpc.JsonService, может ли обслуживаемый класс вернуть объект? - PullRequest
0 голосов
/ 04 октября 2010

Я пытаюсь обслуживать свой пользовательский репозиторий через zend_json_server.Проблема в том, что сервис возвращает пустые объекты.Что я пропустил?сторона сервера:

$repo = App_User_Repository::getInstance();

  $server = new Zend_Json_Server();
  $server->setClass($repo);

  if ('GET' == $_SERVER['REQUEST_METHOD']) {
      $server->setTarget('/service/json-rpc.php')
             ->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);
      $smd = $server->getServiceMap();

      // Set Dojo compatibility:
      $smd->setDojoCompatible(true);
      header('Content-Type: application/json');
      echo $smd;
      return;
  }

  $server->handle();

сторона клиента:

    var object = new dojo.rpc.JsonService('/service/json-rpc.php');
    var deferred = object.getById(1);
    deferred.addBoth(function(result) {console.log(result)});

Вывод консоли Firebug:

 Object {}

Это должен быть объект пользователя

Ответы [ 2 ]

0 голосов
/ 21 февраля 2011

Я недавно столкнулся с той же проблемой, и это не было проблемой с отложенным додзё. Я предполагаю, что getById(1) является вашим удаленным вызовом функции, и в этом случае, если ваш сервер находит результаты, dojo не должен получать пустой объект. Даже использование метода addBoth для отложенного объекта все равно покажет результат с сервера, что заставляет меня поверить, что ваша проблема не в каком-либо из кода, который вы перечислили, а в вызове App_User_Repository в вашем классе *1004*. Вы использовали Zend_Dojo_Data или что-то еще для json кодирования перед возвратом? Это может затмить ваш результат, Zend_Json_Server сделает кодировку за вас.

0 голосов
/ 09 февраля 2011

При выполнении фактического RPC с помощью метода "getById ()" возвращается объект dojo.deferred.В этот момент выполняется асинхронный запрос.Используя отложенный объект, вы можете заранее определить обратные вызовы и обработчики ошибок, ожидая ответа, который будет возвращен.

Проверьте, не является ли фактический объект ответа также пустым.Помните, что вы все равно должны использовать ключевое слово return в ваших прикрепленных классах, чтобы возвращать результаты обратно в Zend_Json_Server.Zend_Json_Server затем сериализует и автоматически возвращает возвращаемое значение.Ответ от Zend_Json_Server всегда является сериализованным объектом в JSON, содержащим идентификатор (который увеличивается автоматически при каждом запросе), строку, указывающую, какая версия jsonrpc используется (т. Е. 2.0), и, конечно, результат, содержащий возвращенные данные из присоединенногоclass.

Метод setClass () должен быть не экземпляром объекта, а строкой, содержащей className класса, который вы хотите присоединить.Zend_Json_Server самостоятельно обрабатывает создание экземпляра объекта, а также генерирует SMD (Service Method / Mapper Description).Не забудьте документировать каждый публичный метод с помощью docblocks, так как Zend_Json_Server использует эти docblocks для определения SMD.

Кроме того, гораздо удобнее использовать интерфейс, похожий на свободный, с методом then (), например, так:

var myService = new dojo.rpc.JsonService('/service/json-rpc.php?');
var deferredObj = myService.doThis('myArgument');
deferredObj.then(callback, errorHandler).then(afterCallback).then(cleanUp);

В приведенном выше примере переменные callback, errorHandler, afterCallback и cleanUp фактически являются ссылками на функции.Первый метод then (), который вы вызываете, автоматически передает результат rpc в функцию обратного вызова.Если вы выбросите исключение из подключенного класса rpc, вместо этого будет вызван метод errorHandler (второй необязательный аргумент вызова метода first then ()).

Дополнительная информация: http://www.sitepen.com/blog/2010/05/03/robust-promises-with-dojo-deferred-1-5/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...