返回带有异常侦听器的json

时间:2019-01-15 08:25:46

标签: symfony exception exception-handling

我想创建一个空的自定义异常和异常侦听器,每次我自动抛出自定义异常时,都会自动返回该json响应,我的异常侦听器首先调用并返回新的json响应,而没有任何异常页面

我尝试了这段代码,但是我总是看到没有json响应的异常页面

这是我的听众:

 class CustomExceptionListener
    {
    public function onKernelException(GetResponseForExceptionEvent $event)
    {

    $exception = $event->getException();
    if($exception instanceof TestException)
    {
        return new JsonResponse(['code'=>JsonResponse::HTTP_FORBIDDEN,'status'=>"missing api key!"],JsonResponse::HTTP_FORBIDDEN);
    }
}
}

例外:

class TestException extends RuntimeException
{
}

这是我的用法:

if (!in_array($token, $this->apiKeys)) {
      throw new TestException();
}

1 个答案:

答案 0 :(得分:1)

如果仅从该处理程序返回一些新响应,则什么都不会发生。您必须通过以下方式替换事件中当前正在使用的响应:

<?php

class CustomExceptionListener
{
    public function onKernelException(GetResponseForExceptionEvent $event)
    {

        $exception = $event->getException();
        if ($exception instanceof TestException) {
            $response = new JsonResponse(['code' => JsonResponse::HTTP_FORBIDDEN, 'status' => "missing api key!"], JsonResponse::HTTP_FORBIDDEN);
            $event->setResponse($response);
        }
    }
}

一个可能的来源是https://symfony.com/doc/current/event_dispatcher.html上的Symfony文档本身。出现这种情况的原因是Symfony为该事件注册了多个处理程序,例如,将异常写入日志。这些部分之一可确保将响应存储在事件中,然后在该过程中稍后从事件中提取响应以发送给客户端(主要是由\Symfony\Component\HttpKernel\HttpKernel::handleException发送给客户端)。

该事件从侦听器传递到侦听器以跟踪多个修改,因为该事件本身包含的元数据多于响应。