Symfony 3.3.8 игнорирует пользовательский нормализатор

почему symfony игнорирует мой пользовательский нормализатор?

src/AppBundle/Serializer/Normalizer/ExceptionNormalizer.php

<?php

namespace AppBundle\Serializer\Normalizer;

use Symfony\Component\Serializer\Normalizer\NormalizerInterface;

/**
 * Class ExceptionNormalizer
 */
class ExceptionNormalizer implements NormalizerInterface
{
    /**
     * {@inheritdoc}
     */
    public function normalize($object, $format = null, array $context = array()): array
    {
        return [];
    }

    /**
     * {@inheritdoc}
     */
    public function supportsNormalization($data, $format = null): bool
    {
        return $data instanceof \Exception;
    }
}

src/AppBundle/Resources/config/services.yml

services:
    ...
    app.normalizer.exception:
        class: AppBundle\Serializer\Normalizer\ExceptionNormalizer
        tags:
            - { name: serializer.normalizer }

приложение/config/config.yml

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    #- { resource: services.yml } exclude default services file
    - { resource: "@AppBundle/Resources/config/services.yml" }

Выход исключения

{"ошибка":{"код":404,"сообщение":"Не найдено","исключение":[{"сообщение":"AppBundle\Entity\Объект пользователя не найден.","класс":"Symfony\ Компонент.....

Ожидаемый вывод исключения

{}


person andrew357    schedule 07.09.2017    source источник
comment
Добро пожаловать в переполнение стека. Пожалуйста, найдите время, чтобы прочитать правила публикации, иначе, скорее всего, вы получите отрицательные голоса.   -  person catbadger    schedule 07.09.2017
comment
Похоже, это не имеет ничего общего с нормализатором - нет сущности пользователя, с которой он пытается работать.   -  person Jason Roman    schedule 08.09.2017
comment
@JasonRoman это нормализатор исключений, а не пользовательский нормализатор. Я пытаюсь переопределить вывод исключения для чего-то другого, но у меня есть та же строка с информацией об исключении.   -  person andrew357    schedule 08.09.2017
comment
Покажите код, в котором вы определяете и вызываете сериализатор или этот нормализатор.   -  person svgrafov    schedule 08.09.2017


Ответы (1)


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

class ExceptionListener
{
/** @var LoggerInterface */
private $logger;


public function __construct(LoggerInterface $logger)
{
    $this->logger = $logger;
}

public function onKernelException(GetResponseForExceptionEvent $event)
{
    $e = $event->getException();
    if ($e instanceof ValidationException) {
        $event->setResponse(new JsonResponse(['error' => $e->getViolations()], 422)
    } elseif ($e instanceof DomainException) {
        $this->logger->warning('Exception ' . get_class($e) , ['message' => $e->getMessage()]);
        $event->setResponse(
        new JsonResponse(['error' => 'Something is wrong with your request.'], 400);
    } elseif ($e instanceof NotFoundHttpException) {
        $event->setResponse(new JsonResponse(['error' => 'Not found.'], 404);
    } else {
        $event->setResponse(new JsonResponse(['error' => $this->translator->trans('http.internal_server_error')], 500);
    }
}

}

Обновить services.yml

  app.exception_listener:
    class: Application\Listeners\ExceptionListener
    arguments: ['@domain.logger']
    tags:
      - { name: kernel.event_listener, event: kernel.exception }

Дополнительная информация о слушателях и событиях https://symfony.com/doc/current/event_dispatcher.html< /а>

Ваш нормализатор, скорее всего, игнорируется, потому что вы не зарегистрировали его в своем сериализаторе.

person svgrafov    schedule 08.09.2017