return json 异常侦听器

return json with exception listener

我想创建一个空的自定义异常和异常侦听器,return json 每次我自动抛出我的自定义异常时都会响应我的异常侦听器首先调用 return 新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();
}

如果您只是 return 来自该处理程序的一些新响应,则什么也不会发生。您必须通过以下方式替换事件中当前正在使用的响应:

<?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)。

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