2013-01-03 95 views
1

我正在開發一個沉重的AJAX Symfony 2應用程序。我的大部分操作都是以這種方式開始的:當請求不是AJAX請求時拋出什麼樣的異常?

if($this->getRequest()->isXmlHttpRequest()) { 
    // Do something 
} 

該操作僅當它響應AJAX請求時才必須執行。我認爲這將是爲了簡潔起見,更好地縮進更好做的事情是這樣的:

if(false === $this->getRequest()->isXmlHttpRequest()) { 
    // throw some exception 
} 

// Do something 

我的問題是我不知道什麼是最appropiate例外,我可以拋出做。我想就這個問題得到一些反饋。也許AccessDeniedException? Symfony預定義的Exception是否適合?或者我應該創建一個新的異常擴展基本的PHP異常類?任何意見將非常感激,併爲我的英語感到難過。


編輯:這個呢?

https://github.com/symfony/HttpKernel/blob/master/Exception/BadRequestHttpException.php

回答

2

你沒有提到的認證,所以我猜想這是不是一個問題在這裏。 既然如此,我就不會使用 AccessDeniedException,因爲它會產生一個 401 Unauthorized錯誤,這意味着用戶的憑據不正確或缺少 。以下是401 Unauthorized狀態的定義:

該請求需要用戶驗證。響應必須包含一個WWW-Authenticate頭域(14.47節),其中包含一個適用於所請求資源的挑戰。客戶端可以用適當的授權標題字段重複請求(14.8節)。如果請求已包含授權憑證,則401響應表明授權已被拒絕。如果401響應包含與先前響應相同的挑戰,並且用戶代理至少已經嘗試過一次認證,則用戶應該被呈現給響應中給出的實體,因爲該實體可能包含相關的診斷信息。 HTTP訪問認證在「HTTP認證:基本和摘要訪問認證」[43]中解釋。

我也不會去BadRequestHttpException。這將返回400響應,這意味着服務器不理解請求。我認爲在這種情況下,服務器理解請求,但拒絕履行它。以下是400響應的完整定義:

由於格式錯誤,服務器無法理解請求。客戶端不應該在沒有修改的情況下重複請求。

我認爲最接近你的情況符合這裏的HTTP狀態403 Forbidden

服務器理解了請求,但拒絕執行。授權不起作用,請求不應重複。如果請求方法不是HEAD並且服務器希望公開爲什麼請求沒有被滿足,那麼它應該描述在實體中拒絕的原因。如果服務器不希望將該信息提供給客戶端,則可以使用狀態碼404(未找到)代替。

據Symfony的上github,它看起來並不像Symfony的有ForbiddenException,或任何類似......我認爲這是一個有些奇怪(也許我失去了一些東西?)。

如果是這種情況,您可以編寫自己的,實施HttpExceptionInterface(或簡單地通過擴展HttpException)。那麼,或者你可以在飛行中創建一個通用的:

throw new HttpException(403, "Forbidden"); 
+0

感謝朋友,你的文章真的很有用。只是想我會澄清的是,Symfony中的AccessDeniedException將返回一個403響應,而不是一個401響應。然而,這個異常在Symfony中使用,當用戶沒有所需的角色,所以我想403是要走的路,但該類不說服我,也許我應該去你的最後一個解決方案。非常感謝! – vicmarq

相關問題