Zend framework2 ZendFramework2中的Restful控制器-其参数如何工作?

Zend framework2 ZendFramework2中的Restful控制器-其参数如何工作?,zend-framework2,Zend Framework2,这是我对create函数的单元测试: public function testCreate() { $this->routeMatch->setMatchedRouteName('restful'); $this->request->setMethod('POST') ->setContent('name=A'); $result = $this->controller->dispatch

这是我对create函数的单元测试:

  public function testCreate() {
    $this->routeMatch->setMatchedRouteName('restful');
    $this->request->setMethod('POST')
                  ->setContent('name=A');

    $result = $this->controller->dispatch($this->request);
    $response  = $this->controller->getResponse();

    $this->assertEquals(403, $response->getStatusCode());
    $this->assertArrayHasKey('id', $result);
  }
public function create($data) {
    if (empty($data)) {
      $this->response->setStatusCode(400);
      return;
    }

    for ($i = 0; $i < count(self::$ideas); $i++) {
      if (self::$ideas[$i]['name'] == $data['name']) {
        $this->response->setStatusCode(404);
        return;
      }
    }

    //@todo: secure the API
    self::$index++;
    $tmpArray = array('id'=>self::$index, 'name'=>$data['name']);
    $this->response->setStatusCode(403);
  }
这是我的职责:

  public function testCreate() {
    $this->routeMatch->setMatchedRouteName('restful');
    $this->request->setMethod('POST')
                  ->setContent('name=A');

    $result = $this->controller->dispatch($this->request);
    $response  = $this->controller->getResponse();

    $this->assertEquals(403, $response->getStatusCode());
    $this->assertArrayHasKey('id', $result);
  }
public function create($data) {
    if (empty($data)) {
      $this->response->setStatusCode(400);
      return;
    }

    for ($i = 0; $i < count(self::$ideas); $i++) {
      if (self::$ideas[$i]['name'] == $data['name']) {
        $this->response->setStatusCode(404);
        return;
      }
    }

    //@todo: secure the API
    self::$index++;
    $tmpArray = array('id'=>self::$index, 'name'=>$data['name']);
    $this->response->setStatusCode(403);
  }
公共函数创建($data){
if(空($数据)){
$this->response->setStatusCode(400);
返回;
}
对于($i=0;$iresponse->setStatusCode(404);
返回;
}
}
//@todo:保护API
self::$index++;
$tmpArray=array('id'=>self::$index,'name'=>$data['name']);
$this->response->setStatusCode(403);
}
但美元数据似乎总是空白的。我在部件编写单元测试中错了吗? 当我尝试将curl POST与
-d
一起使用时,$data的值与我通过
curl
发布的值相同。我很困惑这里怎么了

感谢阅读并期待您的回答:)

回答

我成功地完成了单元测试


有关更多信息,我使用实现restful控制器

如果查看\Zend\Mvc\controller\AbstractRestfulController方法processPostData,您会注意到在控制器中创建的方法从请求对象获得了一个post参数数组

如果查看\Zend\Http\Request,$postParams属性由setPost方法填充

现在,子类\Zend\Http\PhpEnvironment\Request(由ZF2在请求某些内容时使用)在实例化时扩展\Zend\Http\Request(如上所述)(\uuuu construct method)调用setPost方法(如上所述),为其提供$\u POST数组

这意味着ZF2最终会在内部为控制器的create方法提供$\u POST内容,而不是解析请求体

现在来看看你的代码

我认为,如果您没有先设置事件框架,dispatch将一事无成。相反,您可以调用controllers execute方法,为其提供MvcEvent。MvcEvent需要设置您实例化的请求。 其次,如上所述,您需要调用请求的setPost并为其提供一个数组,以便create方法正常工作。(另一方面,PUT从请求主体读取数据)


尝试这样做,如果您仍然有问题,我会尝试尽快给您举个例子。

您能粘贴您的路线配置吗?@DanielM我使用的模块来自#scaraveous:谢谢您的回答。我试图自己创建一个测试,看看我是否能想出什么:)让我知道它是如何进行的。现在做这些事情已经太晚了:)谢谢你的帮助@scaraveos。我想出了一个有效的测试:很好!总是乐于助人。