вернуть JSON с прослушивателем исключений - PullRequest
0 голосов
/ 15 января 2019

я хочу создать пустой пользовательский исключение и прослушиватель исключений, которые будут возвращать ответ 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 голосов
/ 15 января 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...