请求不是AJAX请求时抛出什么样的异常?

时间:2013-01-03 18:26:48

标签: ajax exception symfony

我正在开发一款重型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

1 个答案:

答案 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");