На каком уровне в Symfony перехватывать ошибки?

Коллеги, добрый вечер!
На каком уровне в Symfony перехватывать ошибки, что бы сервер отвечал всегда валидным JSON.
Идея заключается в том, что при любом исходе, клиент всегда получал JSON определённой структуры.

Например:
/database.getCityById?id=3538
{
    "data": {
        "id": 3538,
        "name": "Воронеж",
        "region": {
            "id": 3529,
            "name": "Воронежская обл."
        },
        "country": {
            "name": "Россия",
            "id": 3159
        }
    },
    "code": 0
}


Но в какой-то момент, что, то произошло, например база данных дала клину или что-то ещё.

Фреймворк перехватывает ошибку.
Информацию записывает в лог, а клиенту что-то типа

{
  "code": 1,
  "msg": "unknown error"
}


Мне нужно это для того что бы Nuxt всегда правильно реагировал на подобного рода ошибки.

Мой первый вариант:
Перехват на самом верхнем уровне

try {
    $response = $kernel->handle($request);
} catch (Exception $e) {
    $response = new JsonResponse(["code" => 1]);
    $response->send();
}
  • Вопрос задан
  • 156 просмотров
Решения вопроса 1
tommy-vercetti
@tommy-vercetti
Создаем слушатель событий и подписываемся на KernelEvents::EXCEPTION. Далее в методе onKernelException подготавливаем и сеттим респонс.

namespace App\EventListener;

use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;

class ExceptionListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            KernelEvents::EXCEPTION => ['onKernelException'],
        ];
    }

    public function onKernelException(ExceptionEvent $event): void
    {
        // You get the exception object from the received event
        $exception = $event->getException();
        $message = sprintf(
            'My Error says: %s with code: %s',
            $exception->getMessage(),
            $exception->getCode()
        );

        // Customize your response object to display the exception details
        $response = new Response();
        $response->setContent($message);

        // HttpExceptionInterface is a special type of exception that
        // holds status code and header details
        if ($exception instanceof HttpExceptionInterface) {
            $response->setStatusCode($exception->getStatusCode());
            $response->headers->replace($exception->getHeaders());
        } else {
            $response->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR);
        }

        // sends the modified response object to the event
        $event->setResponse($response);
    }
}

Подробнее https://symfony.com/doc/current/event_dispatcher.html
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы