2014-10-07 71 views
0

我想在CakePHP 2.5.3中创建一些通用的返回函数来标准化resposnes。我正在使用Router::parseExtensions('json', 'xml');CakePHP响应发送为空

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

见除了与你的代码,到底为什么会你想在这一点上退出脚本的问题? – ndm 2014-10-07 02:25:37

+0

@ndm我的代码有什么问题?至于我为什么想退出这里是一个例子。如果我发现用户无法访问他们试图获取的项目,我希望它返回403并停止执行。 – 2014-10-07 03:05:38

回答

1

在渲染视图之前,您正在中止,因此这是预期的行为。

你的CakeResponse::send()调用实际上没有效果(除了可能的头被发送),并且这不会导致错误的唯一原因是因为正在被回显的正文当时是空的,否则你会收到“头文件已经发送”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(); 
} 

这样一个适当的身体会为响应进行设置。

+0

'$ this-> render();'起作用。非常感谢你。我有要求每次发送状态,数据和消息的结构化json,包括错误。否则,我会很乐意抛出错误。 – 2014-10-07 03:53:25