2014-10-07 122 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