Zend_Json_Server和dojo.rpc.JsonService,服务类可以返回一个对象吗?

时间:2010-10-04 08:49:59

标签: json zend-framework dojo

我正在尝试通过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 :(得分:0)

使用“getById()”方法执行实际RPC时,将返回dojo.deferred对象。此时,正在运行异步请求。通过使用延迟对象,您可以提前定义回调和错误处理程序,同时等待返回响应。

检查实际响应对象是否也为空。请记住,您仍然必须在附加的类中使用return关键字将结果返回给Zend_Json_Server。然后,Zend_Json_Server将序列化并自动发回返回的值。来自Zend_Json_Server的响应始终是JSON中的序列化对象,包含一个id(随每个请求自动递增),一个字符串指示正在使用的jsonrpc版本(即2.0),当然还包含附加的返回数据的结果类。

setClass()方法不应该是对象实例,而是包含要附加的类的className的字符串。 Zend_Json_Server自己处理对象实例的创建,以及生成SMD(服务方法/映射器描述)。请记住使用docblocks记录每个公共方法,因为Zend_Json_Server使用这些docblock来确定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方法(第一个then()方法调用的第二个可选参数)。

更多信息:http://www.sitepen.com/blog/2010/05/03/robust-promises-with-dojo-deferred-1-5/

答案 1 :(得分:0)

我最近遇到了同样的问题,这不是dojo deferred的问题。我假设getById(1)是您的远程函数调用,在这种情况下,如果您的服务器找到结果,则dojo不应该获取空对象。即使在延迟对象上使用addBoth方法,仍会显示服务器的结果,这会让我相信您的问题不在您列出的任何代码中,但getById(1)调用您的{ {1}}课程。在返回之前,您是否使用Zend_Dojo_Data或其他东西进行json编码?那会破坏你的结果,Zend_Json_Server会为你做编码。