我正在尝试在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();
而不是它的工作原理。但是我想要停止请求(特别是在出错时)。
答案 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();
}
这样就可以为响应设置适当的身体。
另见