我正在尝试在 CakePHP 2.5.3 中创建一些通用返回函数来标准化响应。我正在使用
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();
就可以了。但是我希望停止请求(特别是在错误时)。
您在视图渲染之前就中止了,所以这是预期的行为。
您的
CakeResponse::send()
调用实际上没有任何效果(除了可能发送的标头之外),这不会导致错误的唯一原因是因为当时回显的正文是空的,否则您会收到一个“ Cake 输出渲染数据时出现headers已经发送”错误。
就我个人而言,我可能会使用异常而不是手动发送/中止的东西,比如
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();
}
这样就可以为响应设置适当的主体。
另请参阅