я хочу создать пустой настраиваемый исключение и прослушиватель исключений, который возвращает ответ 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();
}
@NicoHaase, а что наоборот? Я смущен!!
if (!$exception instanceof TestException) - поэтому JsonResponse выдается только тогда, когда данное исключение - нет типа TestException@NicoHaase, извините, сообщение отредактировано, это моя ошибка при вставке кода. не могли бы вы мне помочь, как я могу решить эту проблему?
Интересный. Вы проверили, вызывается ли все-таки ваш слушатель? Как вы его настраивали?
@NicoHaase звучит так, что он достается моему слушателю раньше, и это нормально. но проблема в том, что я не могу вернуть ответ json в моем исключении. например, я могу повторить эхо, но не могу вернуть ответ json




Если вы вернете только новый ответ от этого обработчика, ничего не произойдет. Вы должны заменить ответ, который используется в данный момент, следующим образом:
<?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);
}
}
}
Возможным источником этого является сама документация Symfony по адресу https://symfony.com/doc/current/event_dispatcher.html. Причина такого поведения в том, что Symfony регистрирует несколько обработчиков для этого события, например, для записи исключений в журнал. Одна из этих частей гарантирует, что ответ сохраняется в событии, а позже в процессе извлекается ответ из события для отправки клиенту (в основном \Symfony\Component\HttpKernel\HttpKernel::handleException).
Событие передается от слушателя к слушателю для отслеживания нескольких изменений, поскольку само событие содержит больше метаданных, чем только ответ.
это работает :) . не могли бы вы сказать мне, почему я должен вместо этого вернуться, если он обширен, пожалуйста, дайте мне название этого или ссылку
@sinak хорошо, что помогает. Я приложил дополнительные комментарии к своему ответу - делает ли это его более понятным?
Если вы хотите вернуть такой ответ, если
TestExceptionброшен, почему ваш код проверяет обратное?