Contributed by
James Halsall
in #19822.

有时,在Symfony程序中处理异常时,你可能希望改变原始的HTTP响应状态码 (例如要返回一个 404 错误而不是原来的 5xx 码)。

当然,你不能无故这么做,但是Symfony允许你通过设置一个特殊的 X-Status-Code HTTP头来实现它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;
 
public function onKernelException(GetResponseForExceptionEvent $event)
{
    $exception = $event->getException();
    // 500 is the original status code; but the end user will get a 404
    // 500 是原来的状态码;但是末级用户会得到一个 404
    $response = new Response('...', 500, ['X-Status-Code' => 404]);
 
    // ...
 
    $event->setResponse($response);
}

X-Status-Code header并非标准的HTTP功能,因此它总是给我们带来麻烦。在Symfony 3.3中,我们最终决定去掉它,并以标准的方式来处理HTTP响应。

毋须 X-Status-Code 头,现在你可以在响应中,按照常规来设置状态码,调用全新的 allowCustomResponseCode() 方法,以告之Kernel来使用设置在事件中的response对象中的response code:

1
2
3
4
5
6
7
8
9
10
public function onKernelException(GetResponseForExceptionEvent $event)
{
    $exception = $event->getException();
    $response = new Response('...', 404);
 
    // ...
 
    $event->allowCustomResponseCode();
    $event->setResponse($response);
}