我正在开发一款重型AJAX Symfony 2应用。我的大部分行为都是这样开始的:
if($this->getRequest()->isXmlHttpRequest()) {
// Do something
}
只有在响应AJAX请求时才必须执行该操作。我认为为了简单和更好的缩进,以这种方式做事会更好:
if(false === $this->getRequest()->isXmlHttpRequest()) {
// throw some exception
}
// Do something
我的问题是我不知道什么是最合适的例外我可以抛出。我想就这个问题得到一些反馈。也许AccessDeniedException?任何Symfony预定义的Exception都适合吗?或者我应该创建一个扩展基本PHP Exception类的新Exception?对于我的英语,任何意见都会非常感激和抱歉。
编辑:这个怎么样?
https://github.com/symfony/HttpKernel/blob/master/Exception/BadRequestHttpException.php
答案 0 :(得分:3)
你没有提到身份验证,所以我认为这不是问题。 在这种情况下,我不会使用。以下是AccessDeniedException
,因为它会产生401 Unauthorized
错误,这意味着用户的凭据不正确或缺失401 Unauthorized
状态的定义:
请求需要用户身份验证。响应必须包含WWW-Authenticate头字段(第14.47节),其中包含适用于所请求资源的质询。客户端可以使用合适的Authorization头字段重复请求(第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");