我想创建一个空的自定义异常和异常侦听器,每次我自动抛出自定义异常时,都会自动返回该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();
}
答案 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
发送给客户端)。
该事件从侦听器传递到侦听器以跟踪多个修改,因为该事件本身包含的元数据多于响应。