CakePHP响应发送为空

时间:2014-10-07 00:19:18

标签: cakephp response

我正在尝试在CakePHP 2.5.3中创建一些通用返回函数来标准化resposnes。我正在使用Router::parseExtensions('json', 'xml');

protected function returnSuccess($data = null, $message = 'Success', $extraSerialize = array(), $statusCode = 200) {
    $this->set(array(
        'status' => true,
        'data' => $data,
        'message' => $message,
        '_serialize' => array_merge(array('status', 'data', 'message'), $extraSerialize)
    ));

    $this->response->statusCode($statusCode);
    $this->response->send();
    $this->_stop();
}


protected function returnError($data = null, $message = 'Error', $extraSerialize = array(), $statusCode = 400) {
    $this->set(array(
        'status' => false,
        'data' => $data,
        'message' => $message,
        '_serialize' => array_merge(array('status', 'data', 'message'), $extraSerialize)
    ));

    $this->response->statusCode($statusCode);
    $this->response->send();
    $this->_stop();
}

然而,响应始终为空。如果我移除$this->_stop();而不是它的工作原理。但是我想要停止请求(特别是在出错时)。

1 个答案:

答案 0 :(得分:1)

在视图呈现之前,您正在中止,这是预期的行为。

您的CakeResponse::send()通话实际上没有效果(除了可能发送的标头之外),并且这不会导致错误的唯一原因是因为当时正在回显的正文是空的,否则您&# 39; d收到已发送的" 标题" Cake输出渲染数据时出错。

就我个人而言,我可能会使用例外而非本手册发送/中止内容,例如

if(!$abc) {
    throw new ForbiddenException();
}

// ...

或简单的return

if(!$abc) {
    return $this->returnError();
}

// ...

其中returnError()返回$this->response。两者都不需要调用send()_stop()

但是,它当然也可以手动调用视图渲染

protected function returnError($data = null, $message = 'Error', $extraSerialize = array(), $statusCode = 400) {
    // ...

    $this->render();

    $this->response->statusCode($statusCode);
    $this->response->send();
    $this->_stop();
}

这样就可以为响应设置适当的身体。

另见