extjs 4 rest proxy和zend 2 restful controller

时间:2013-01-20 06:33:27

标签: extjs zend-framework2 extjs-mvc

我想从EXTJS 4 rest代理向Zend 2 restful控制器发布数据。 但是当我用firebug检查时,我发现有post数据,但是我无法获取那些数据。如何获取该帖子数据以在我的方法中使用它。 我错了,我无法弄清楚。 任何人都有步骤将数据从其余的Extjs 4代理方法发布到Zend?

3 个答案:

答案 0 :(得分:0)

PHP中从HTTP请求正文加载JSON的标准方法是使用

$some_json = file_get_contents('php://input');
$some_object = json_decode($some_json);

我不知道Zend2是否有自己的方式。

答案 1 :(得分:0)

ExtJS向网址发送sortpagefilter等代数,例如:http://myhost.com/?page=2&sort=myfield

在这种情况下,您只需要拦截RESTController操作中的查询参数:

$page   = $this->params()->fromQuery('page');
$sort   = $this->params()->fromQuery('sort');

向ZF2 REST控制器的数据传输取决于您使用的HTTP方法:

  • GETPUTDELETE收到$id参数;
  • POST用于创建新记录并接收$ data参数。

有关详细信息,请访问:

http://framework.zend.com/manual/current/en/modules/zend.mvc.controllers.html#the-abstractrestfulcontroller

如果您有兴趣,我正在为Sencha开发我的REST代理,我已经使用ExtJSSencha Touch框架进行了测试,它支持分页,远程过滤,远程排序等等

它是使用Zend Framework 2开发的,可能在同一个安装上支持不同的数据库类型。看看:

http://apiskeleton.asaconsult.com/

答案 2 :(得分:-1)

我有完全相同的问题。现在,之前的回复不起作用的原因是因为Zend Studio 10有一个新功能,用于从可视编辑器配置REST服务,该编辑器接收参数并创建路由。这个服务设计者实际上是接受Restful服务的POST操作的主体参数,但它忽略了从ExtJS发送的JSon。更糟糕的是,如果你使用Zend Studio 10中的集成GUI测试服务,它可以很好地工作,并且生成的JSon与ExtJS中的生成完全相同(我实际执行了一些数据转换以达到这一点),并且它不起作用。

真正的问题是,POST方法中的'某些东西'在ExtJS请求中是不同的,而不是从框架本身预期的JSon,它抽象代码从开发人员反序列化这个JSon。

真正的问题是,什么是Zend Server Gateway库期望ExtJS以不同的方式在POST主体中发送?如果这里有成千上万的专家能够检查出来并得到正确的答案,我将非常感激。将回答这个问题的人必须拥有或下载Zend Studio 10的试用版并自行检查ZS10附带的Visual Service Tool是如何工作的。到目前为止,我发现ExtJS4产生的JS就像这样:

{"data":
 {"IdCurso":"0","Nombre":"NodeJS","IdEstadoCurso":"1",
  "IdTipoPeriodo":"1","CantPeriodo":"1","CantAsignatura":"1","IdPlantel":"1"}
}

用于测试服务的Zend GUI,生成(并且服务接受)JSon就像这样:

{
    'data' : '{"Nombre":"NodeJS","IdEstadoCurso":"1","IdTipoPeriodo":"1","CantPeriodo":"1","CantAsignatura":"1","IdPlantel":"1","IdCurso":"0"}'
}

正如您所看到的,数据包含在单引号中,其内容也适用于Zend Framework,可以毫无问题地使用它。 ExtJS使用双引号,也没有引用数据包本身的内容。

这是一个实际可行的补丁,不是最终的解决方案,如果有人找到更好的解决方案,那就太棒了。

尝试将此作为add()(POST)方法中的第一条指令:

$data = json_decode($this->getRequest()->getContent());

您可能需要添加以下内容:

$data = (array) $data;

之后,继续使用$ data变量编写代码,就像参数实际可行时一样。