1

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

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

只有在响应 AJAX 请求时才必须执行该操作。我认为为了简单起见和更好的缩进,以这种方式做事会更好:

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

// Do something

我的问题是我不知道我可以抛出的最合适的异常是什么。我想得到一些关于这个主题的反馈。也许 AccessDeniedException?任何 Symfony 预定义的异常都适合吗?或者我应该创建一个扩展基础 PHP 异常类的新异常?任何意见将不胜感激,对我的英语感到抱歉。


编辑:这个呢?

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

4

1 回答 1

3

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

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

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

由于语法错误,服务器无法理解该请求。客户端不应该在没有修改的情况下重复请求。

我认为与您的情况最匹配的 HTTP 状态是403 Forbidden

服务器理解请求,但拒绝执行。授权将无济于事,并且不应重复请求。如果请求方法不是 HEAD 并且服务器希望公开请求未完成的原因,它应该在实体中描述拒绝的原因。如果服务器不希望向客户端提供此信息,则可以使用状态代码 404(未找到)来代替。

根据github上的 Symfony ,看起来 Symfony 没有ForbiddenException,或类似的东西......我认为这有点奇怪(也许我错过了一些东西?)。

如果是这种情况,您可以编写自己的,实现HttpExceptionInterface(或简单地通过扩展HttpException)。那,或者您可以即时创建一个通用的:

throw new HttpException(403, "Forbidden");
于 2013-01-03T19:48:48.753 回答