Вернуть json с прослушивателем исключений

я хочу создать пустой настраиваемый исключение и прослушиватель исключений, который возвращает ответ 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();
}

Если вы хотите вернуть такой ответ, если TestException брошен, почему ваш код проверяет обратное?

Nico Haase 15.01.2019 09:33

@NicoHaase, а что наоборот? Я смущен!!

sinak 15.01.2019 09:54
if (!$exception instanceof TestException) - поэтому JsonResponse выдается только тогда, когда данное исключение - нет типа TestException
Nico Haase 15.01.2019 09:56

@NicoHaase, извините, сообщение отредактировано, это моя ошибка при вставке кода. не могли бы вы мне помочь, как я могу решить эту проблему?

sinak 15.01.2019 10:00

Интересный. Вы проверили, вызывается ли все-таки ваш слушатель? Как вы его настраивали?

Nico Haase 15.01.2019 10:02

@NicoHaase звучит так, что он достается моему слушателю раньше, и это нормально. но проблема в том, что я не могу вернуть ответ json в моем исключении. например, я могу повторить эхо, но не могу вернуть ответ json

sinak 15.01.2019 11:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
6
192
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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);
        }
    }
}

Возможным источником этого является сама документация Symfony по адресу https://symfony.com/doc/current/event_dispatcher.html. Причина такого поведения в том, что Symfony регистрирует несколько обработчиков для этого события, например, для записи исключений в журнал. Одна из этих частей гарантирует, что ответ сохраняется в событии, а позже в процессе извлекается ответ из события для отправки клиенту (в основном \Symfony\Component\HttpKernel\HttpKernel::handleException).

Событие передается от слушателя к слушателю для отслеживания нескольких изменений, поскольку само событие содержит больше метаданных, чем только ответ.

это работает :) . не могли бы вы сказать мне, почему я должен вместо этого вернуться, если он обширен, пожалуйста, дайте мне название этого или ссылку

sinak 15.01.2019 11:57

@sinak хорошо, что помогает. Я приложил дополнительные комментарии к своему ответу - делает ли это его более понятным?

Nico Haase 15.01.2019 12:06

Другие вопросы по теме