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

当请求不是AJAX请求时,要抛出什么样的异常?,ajax,exception,symfony,Ajax,Exception,Symfony,我正在开发一个很重的AJAX Symfony 2应用程序。我的大部分行动都是这样开始的: if($this->getRequest()->isXmlHttpRequest()) { // Do something } if(false === $this->getRequest()->isXmlHttpRequest()) { // throw some exception } // Do something 只有在响应AJAX请求时才必须执行该操作。我

我正在开发一个很重的AJAX Symfony 2应用程序。我的大部分行动都是这样开始的:

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

// Do something
只有在响应AJAX请求时才必须执行该操作。我认为为了简单和更好的缩进,这样做会更好:

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

// Do something
我的问题是我不知道我能抛出的最合适的例外是什么。我想得到一些关于这个问题的反馈。可能是AccessDeniedException?Symfony预定义的异常是否适合?或者我应该创建一个扩展基本PHP异常类的新异常吗?如果您有任何意见,我将不胜感激,并为我的英语感到抱歉


编辑:这个怎么样


您没有提到身份验证,所以我认为这不是一个问题。在这种情况下,我不会使用
AccessDeniedException
,因为它会产生
401 Unauthorized
错误,这意味着用户的凭据不正确或丢失。以下是
401未经授权
状态的定义:

请求需要用户身份验证。响应必须包括WWW Authenticate标头字段(第14.47节),其中包含适用于请求资源的质询。客户可以使用合适的授权标头字段重复请求(第14.8节)。如果请求已包括授权凭据,则401响应表示已拒绝这些凭据的授权。如果401响应包含与先前响应相同的质询,并且用户代理已至少尝试了一次身份验证,则应向用户呈现响应中给出的实体,因为该实体可能包括相关诊断信息。HTTP访问身份验证在“HTTP身份验证:基本和摘要访问身份验证”[43]中进行了解释

我也不会使用
BadRequestHttpException
。这将返回一个
400
响应,这意味着服务器不理解请求。我认为在这种情况下,服务器理解请求,但拒绝满足请求。以下是
400
响应的完整定义:

由于语法错误,服务器无法理解该请求。未经修改,客户端不应重复请求

我认为与您的案例最接近的HTTP状态是
403禁止

服务器理解该请求,但拒绝满足该请求。授权没有帮助,请求不应重复。如果请求方法不是HEAD,并且服务器希望公开请求未得到满足的原因,那么它应该在实体中描述拒绝的原因。如果服务器不希望将此信息提供给客户端,则可以使用状态代码404(未找到)

根据Symfony的说法,Symfony似乎没有一个
禁止的异常
,或者任何类似的。。。我觉得这有点奇怪(也许我错过了什么?)

如果是这种情况,您可以编写自己的,实现
HttpExceptionInterface
(或者只需扩展
HttpException
)。或者您可以动态创建一个通用的:

throw new HttpException(403, "Forbidden");

谢谢你的朋友,你的帖子真的很有用。我唯一想澄清的是,Symfony中的AccessDeniedException将返回403响应,而不是401响应。但是,当用户没有必需的角色时,在Symfony中会使用此异常,因此我想403是可行的方法,但该类不能说服我,也许我应该使用您的最后一个解决方案。谢谢!