Zendframework 2中的Restful Controller - 它的参数如何工作?

时间:2013-01-08 07:52:08

标签: zend-framework2

这是我对创建功能的单元测试:

  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始终是空白的。我在编写单元测试时错了吗? 当我尝试使用-d的curl POST时,$ data的值与我在curl中发布的值一样。我很困惑这里有什么问题?

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

答案

我想出了我成功的单元测试http://pastebin.com/fwFe0Mi3

有关更多信息,我使用this module来实现restful controller

1 个答案:

答案 0 :(得分:3)

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

如果查看\ Zend \ Http \ Request,请使用setPost方法填充$ postParams属性。

现在子类\ Zend \ Http \ PhpEnvironment \ Request(当你请求某些东西时由ZF2使用)扩展\实例化上的\ Zend \ Http \ Request(上面)(__contruct方法)调用setPost方法(上面)给出它是$ _POST数组。

这意味着最终ZF2在内部使用$ _POST内容提供控制器的create方法,而不是通过解析请求体。

现在你的代码。

如果没有先设置事件框架,我认为dispatch不会做任何事情。相反,你可以调用控制器执行方法,为它提供一个MvcEvent。 MvcEvent需要具有您实例化的请求集。 其次,如上所述,您需要调用请求的setPost并为其提供一个数组,以使create方法正常工作。 (另一方面,PUT从请求体中读取数据)

尝试这样做,如果你仍然遇到麻烦,我会尽快给你一个例子。