我正在編寫CakePHP(cakephp.org)控制器。其中一個動作「myAction」響應AJAX請求。我覺得很煩人的是,如果在動作處理程序中出現任何錯誤,Cake總是響應一個錯誤頁面和 HTTP狀態爲200,這意味着它失敗了,所以我必須打開一個新窗口並直接運行AJAX請求從地址欄中查看輸出並找出出錯的地方。作爲一個例子,說我編寫以下動作,其產生除以零誤差當發生未處理的異常時,讓CakePHP返回50x HTTP響應
function myAction() {
0/0; // produce a divide-by-0 error for the sake of example
}
蛋糕返回一個錯誤頁作爲其爲200的HTTP狀態代碼(換句話說響應,蛋糕是告訴我它返回的「成功」的錯誤頁)
我嘗試過加入以下兩行除以零:
define('DISABLE_DEFAULT_ERROR_HANDLING', true);
set_error_handler('myError', E_ALL);
0/0;
然後在全局命名空間:
function myError($code, $msg) {
CakeLog::write('error', "code=$code: $msg");
header('HTTP/1.0 500 Internal Error');
die($code);
}
在這種情況下,CakePhp從不發送響應。對於瀏覽器來說,響應永遠留在「等待中」。
爲了便於比較,我寫了一個簡單的獨立(PHP,沒有蛋糕)頁:
<?php
function myHandler($errrno, $msg) {
header('HTTP/1.0 500 Internal Error');
die($msg);
}
set_error_handler(myHandler, E_ALL);
0/0;
die('got here');
?>
它的輸出是
被零除
預期。
我知道必須有更好的方法來配置CakePHP自動處理控制器/動作處理程序中的錯誤,這些處理程序不需要執行大量的代碼。
CakePHP and jQuery - Unobtrusive actions和Using HTTP status codes to reflect success/failure of Web service request?上的優秀帖子有助於讓我知道我在正確的軌道上,但他們仍然不滿足我希望Cake發生意外異常時返回50x的HTTP響應的願望。然後,當響應返回時,瀏覽器可能會在頁面上顯示一條消息,例如「發生錯誤,通知網站管理員」,並且我知道要查看Apache錯誤日誌以瞭解真正發生的事情。
歡迎任何想法。
「爲什麼你想擁有自己的錯誤處理」 因爲AppError似乎總是返回HTTP狀態200,即使在請求失敗。對於在瀏覽器窗口中顯示的響應,這可能沒有問題,但對於AJAX調用而言不適用。如果出現問題,我希望它返回一個狀態代碼,告訴處理程序出錯了,比如50x。 這是一個約定,AJAX請求應該總是返回200,並將其實際狀態放在它的響應中,如{「status」:「fooey!」,「reason」:「dunno」,...}。如果是這樣,我想知道更多。 –
這樣覆蓋錯誤,所以它不返回200.你可以使用RequesHandler來檢查ajax並使它像你想要的那樣返回 – dogmatic69